2014-10-09 17 views
6

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ẹ?

+0

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

+0

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 –

+0

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

Trả lời

11

Ahh, tôi hiểu rồi,

TERM đang được gửi đến quá trình này quá sớm, trước khi trình thông dịch Ruby có thể thiết lập móc. Vì vậy, nó chấm dứt nó.

a sleep 1 trước khi kill -TERM #{pid} sắp xếp sự cố.

+1

Không đáng kể trong sự nhận thức. :) 'Thread.pass' cũng có thể hoạt động thay vì' sleep', nhưng một lần nữa nó có thể phụ thuộc vào hệ thống. – moonfly

+0

bạn có ý nghĩa gì khi "thiết lập móc"? nếu Process.spawn đã trở lại với một pid, không phải là quá trình được ngay lập tức tiếp nhận các tín hiệu? –

+0

ohhh trình thông dịch ruby ​​được gọi bên trong Quy trình chưa được thêm vào…. –

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