mam ten przykładowy kod:Dlaczego mój termin nie są ujęte
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`
ikra proces, który przechwytuje TERM, a następnie wysyła do niego termin.
Kłopot w tym, że TERM nie jest tu przechwytywany, a proces po prostu się kończy.
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"
""
Jednak ... Gdybym tylko spać po ikry i wydawania kill z innego procesu termin jest zrobione zgodnie z oczekiwaniami.
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
Inne powłoki
kill -TERM PID
Wyjście
GOT TERM
Co więcej, jeśli staram się potem kill
proces z procesu inicjowania po jego uwięziony w perspektywie handler nie będzie już zabić to.
Co się tutaj dzieje, dlaczego TERM nie jest prawidłowo dostarczany do mojego procesu potomnego przez rodzica?
interesujące ... z jakim systemem operacyjnym jesteś? dla mnie działa dobrze (MacOS): '" 71794 0.0 0.1 2443544 2932 s001 R + 9:22 PM 0: 00.01 ruby-pułapka ("TERM") {stawia "GOT TERM"; sen 100;}; \ n” GOT OKRES " 71794 0,6 0,2 2471356 8168 S001 S + 21:22 0: 00.05 rubin -e trap ('termin') {umieszcza 'GOT TERM snu; 100; 100;} spania \ n" ' –
moonfly
na Linuksie ... Właściwie to podejrzewam, że jest to specyficzne dla Linuksa i związane ze sposobem działania" exec ", drugi pid angażuje się –
Wygląda na to, że zaangażowanych jest wiele PIDów. Badałem zachowanie za pomocą strace i znalazłem dla jednego wywołania skryptu łącznie 14 (1) plików śledzenia PID. – orangejulius