2009-06-10 35 views
6

Tôi muốn viết một kịch bản lệnh shell để sinh ra một số quy trình chạy dài trong nền, sau đó treo xung quanh. Khi nhận được SIGTERM, tôi muốn tất cả các quy trình con cũng kết thúc.kịch bản shell để sinh ra quy trình, chấm dứt trẻ em trên SIGTERM

Về cơ bản, tôi muốn có "quy trình tổng thể".

Dưới đây là những gì tôi có cho đến nay:

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

# supposedly this should kill the child processes on SIGTERM. 
trap "kill $PID1 $PID2" SIGTERM 

wait 

Các kịch bản trên không thành công với trap: 10: SIGTERM: bad trap.

Chỉnh sửa: Tôi đang sử dụng Ubuntu 9.04

Trả lời

5

Câu trả lời của Joe đưa tôi đi đúng hướng. Tôi cũng phát hiện ra tôi nên bẫy thêm các tín hiệu để che phủ các căn cứ của mình.

kịch bản cuối cùng trông như thế này:

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

trap "kill $PID1 $PID2" exit INT TERM 

wait 
+1

Nếu bạn nghĩ rằng bạn phải sử dụng các số tín hiệu, bạn chỉ nên sử dụng các số tiêu chuẩn. Nhưng tôi siggest để sử dụng tên tín hiệu của hệ thống của bạn để thay thế. – TheBonsai

+0

Bạn nói đúng. Tôi hy vọng đây là phiên bản cuối cùng ... – itsadok

+0

Vâng, đó là mã của bạn, bạn có thể có nhiều phiên bản như mong muốn ;-) – TheBonsai

1

Kịch bản này có vẻ chính xác và phù hợp với tôi như mong đợi.

Làm cách nào để gửi tín hiệu SIGTERM tới "quy trình tổng thể"? Có thể bạn nên thực hiện kill -l để kiểm tra tín hiệu nào được hỗ trợ. Khi thông báo lỗi cho thấy bạn gửi tín hiệu "10" mà hệ thống của bạn dường như không nhận ra.

Và tiếp theo thời gian bạn nên thêm hệ điều hành, phiên bản vỏ, hạt nhân, ... cho một câu hỏi như vậy

+0

Cảm ơn bạn đã trả lời. Tôi đang sử dụng Ubuntu 9,04, và đọc câu trả lời của bạn tôi nhận ra điều này có lẽ là một điều bash so với dash. Nó thực sự hoạt động như được quảng cáo nếu tôi thay đổi dòng đầu tiên thành #!/Bin/bash – itsadok

4

tôi nghi ngờ/bin/sh chưa là Bash (mặc dù bạn đánh dấu các câu hỏi như 'Bash').

Từ tin nhắn, tôi đoán đó là DASH. Kiểm tra hướng dẫn của nó hoặc chỉ sửa chữa shebang của bạn nếu bạn cần viết mã Bash.

10

này làm việc cho tôi:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT 
  • kill -- -$$ gửi một SIGTERM vào nhóm toàn bộ quá trình, do đó giết chết cũng con cháu.

  • Chỉ định tín hiệu EXIT hữu ích khi sử dụng set -e (xem chi tiết here).

+0

pid 0 có nghĩa là gì? Và bạn có nghĩa là '...' theo nghĩa đen, hoặc là một trình giữ chỗ? – itsadok

+0

Bằng cách nào đó điều này chỉ làm việc cho tôi khi tôi sử dụng 'kill - 0' thay cho' kill - - $$ '. Người thứ hai nói '11641: không tìm thấy tiến trình nào' vì một lý do nào đó. – WorldSEnder

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