Tôi có mẫu này mã:Tại sao HẠN của tôi không bị bắt
pid = Process.spawn("exec ruby -e \"trap('TERM'){ puts 'GOT TERM'; sleep 100; }; sleep 100\"")
Thread.new do
Process.wait(pid)
end
p `ps aux | grep #{pid} | grep -v grep`
`kill -TERM #{pid}`
sleep 1
p `ps aux | grep #{pid} | grep -v grep`
Chúng đẻ trứng một quá trình chụp HẠN và sau đó gửi một HẠN với nó.
Sự cố là, TERM không bị bắt tại đây và quá trình đơn giản chấm dứt.
ruby test.rb
"sam 8828 0.0 0.0 30576 5052 pts/9 Rl+ 11:48 0:00 ruby -e trap('TERM'){ puts 'GOT TERM'; sleep 100; }; sleep 100\n"
""
Tuy nhiên ... Nếu tôi chỉ ngủ sau khi đẻ trứng và ban hành tiêu diệt từ một quá trình khác nhau HẠN được chụp như mong đợi.
pid = Process.spawn("exec ruby -e \"trap('TERM'){ puts 'GOT TERM'; sleep 100; }; sleep 100\"")
Thread.new do
Process.wait(pid)
end
puts pid
sleep 100
vỏ khác
kill -TERM PID
Output
GOT TERM
Hơn nữa, nếu tôi cố gắng sau đó kill
quá trình từ quá trình có nguồn gốc sau khi nó bị mắc kẹt trong HẠN xử lý sẽ không còn giết nó.
Điều gì đang diễn ra ở đây, tại sao TERM không được gửi đúng cho quy trình con của tôi từ cha mẹ?
thú vị ... bạn đang sử dụng hệ điều hành nào? với tôi nó hoạt động tốt (MacOS): '" 71794 0.0 0.1 2443544 2932 s001 R + 9:22 PM 0: 00.01 ruby -e trap ('TERM') {đặt 'GOT TERM'; ngủ 100;}; \ n " GOT TERM " 71794 0.6 0.2 2471356 8168 s001 S + 9:22 PM 0: 00.05 ruby -e trap ('TERM') {đặt 'GOT TERM'; sleep 100;}; sleep 100 \ n " ' –
moonfly
trên linux ... Tôi thực sự nghi ngờ đây là linux cụ thể và liên quan đến cách" exec "hoạt động, một pid thứ hai là nhận được tham gia –
Dường như có rất nhiều PID tham gia. Tôi đã điều tra hành vi thông qua strace, và tìm thấy cho một trong những yêu cầu của kịch bản của bạn tổng cộng 14 (1) PID dấu vết tập tin được tạo ra. – orangejulius