2012-10-10 26 views
8

Tôi có tập lệnh bash gắn kết và ngắt kết nối thiết bị, thực hiện một số thao tác đọc ở giữa. Vì thiết bị rất chậm, kịch bản mất khoảng 15 giây để hoàn thành (việc lắp đặt ít nhất 5-6 giây). Vì việc để thiết bị này được gắn kết có thể gây ra các sự cố khác, tôi không muốn tập lệnh này bị gián đoạn.Tập lệnh Bash: không thể xử lý đúng SIGTSTP

Có nói rằng, tôi có thể xử lý chính xác SIGINT (Ctrl + c), nhưng khi tôi cố gắng xử lý SIGTSTP (Ctrl + z), tập lệnh bị đóng băng. Có nghĩa là tín hiệu bị mắc kẹt nhưng trình xử lý không chạy.

#!/bin/sh 
cleanup() 
{ 
    # Don't worry about unmounting yet. Just checking if trap works. 
    echo "Quitting..." > /dev/tty 
    exit 0 
} 
trap 'cleanup' SIGTSTP 
... 

Tôi phải gửi tín hiệu KILL theo cách thủ công. Bất kỳ ý tưởng tại sao điều này đang xảy ra và làm thế nào tôi có thể sửa chữa nó?

Trả lời

4

Hệ vỏ không thực thi bẫy cho đến khi quá trình thực hiện hiện tại kết thúc. (ít nhất, đó là hành vi của bash 3.00.15). Nếu bạn gửi SIGINT qua^c, nó được gửi tới tất cả các tiến trình trong nhóm tiến trình nền trước; nếu chương trình hiện đang thực hiện nhận nó và chấm dứt thì bash có thể thực hiện bẫy. Tương tự với SIGTSTP qua^z; bash nhận tín hiệu nhưng không thực thi bẫy cho đến khi chương trình đang chạy kết thúc, mà nó không thực hiện nếu nó có hành vi mặc định và bị treo. Hãy thử thay thế ... bằng một đơn giản read f và lưu ý rằng bẫy thực thi ngay lập tức.

+0

Điều đó có ý nghĩa rất nhiều. Vì vậy, nó có vẻ như trừ khi tất cả các tập tin nhị phân bạn thực hiện với kịch bản cũng xử lý^z cách bạn làm, không có cách nào để xử lý đúng^z. Có đúng không? – Ram

+0

Bạn có thể chạy công việc không đồng bộ theo tập hợp và đợi nó. ví dụ: 'setsid cmd & wait' thay vì chỉ' cmd'. –

+0

Dường như làm điều đó. Cảm ơn bạn đã giúp đỡ! Nhưng chỉ tò mò thôi, liệu tiến trình này vẫn không bị dừng lại dưới một phiên mới? – Ram

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