2013-04-03 36 views
19

Có thể bash để chặn SIGINT không, làm điều gì đó, và sau đó bỏ qua nó (giữ bash đang chạy).Bắt SIGINT trong bash, xử lý VÀ bỏ qua

tôi biết rằng tôi có thể bỏ qua SIGINT với

trap '' SIGINT 

Và tôi cũng có thể làm điều gì đó trên SIGINT với

trap handler SIGINT 

Nhưng điều đó vẫn sẽ ngừng kịch bản sau khi handler thực thi. Ví dụ.

#!/bin/bash 

handler() 
{ 
    kill -s SIGINT $PID 
} 

program & 
PID=$! 

trap handler SIGINT 

wait $PID 

#do some other cleanup with results from program 

Khi tôi nhấn ctrl + c, SIGINT để chương trình sẽ được gửi đi, nhưng bash sẽ bỏ qua wait TRƯỚC chương trình đã bị đóng cửa đúng cách xuống và tạo ra sản lượng của nó trong xử lý tín hiệu của nó.

Sử dụng @suspectus câu trả lời tôi có thể thay đổi wait $PID tới:

while kill -0 $PID > /dev/null 2>&1 
do 
    wait $PID 
done 

Điều này thực sự làm việc cho tôi Tôi chỉ không chắc chắn 100% nếu điều này là 'sạch' hay 'workaround bẩn'.

+2

Tại sao nó in nhiều lần? – cnicutar

+0

@cnicutar: Nếu tôi nhấn ctrl + c nhiều lần (mà tôi không thể ở dạng hiện tại, bởi vì nó dừng sau lần đầu tiên) – Zulan

+0

Tôi đã thay đổi ví dụ của mình để gần với trường hợp sử dụng thực tế hơn. – Zulan

Trả lời

4

bẫy sẽ trả về từ trình xử lý, nhưng sau lệnh được gọi khi trình xử lý được gọi.

Vì vậy, giải pháp là một chút vụng về nhưng tôi nghĩ rằng đó là những gì được yêu cầu. trap handler INT cũng sẽ hoạt động.

trap 'echo "Be patient"' INT 

for ((n=20; n; n--)) 
do 
    sleep 1 
done 
+0

1. Không hoạt động; 2. Đây có lẽ không phải là những gì người dùng muốn. – anishsane

+0

Nếu bẫy được kích hoạt (để làm như vậy, bạn cần phải thay thế 'sleep 1' bằng' sleep 1 & wait'), vòng lặp thoát sau khi nhấn Control-C; bạn không tiếp tục chạy nơi tín hiệu xảy ra sau khi bẫy trả về. – chepner

+1

@anishsane 2. người dùng muốn gì? Tôi nghĩ người dùng muốn bẫy SIGINT và duy trì quyền kiểm soát kịch bản của mình. – suspectus

Các vấn đề liên quan