2014-10-09 17 views
6

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?

+0

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

+0

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ę –

+0

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

Odpowiedz

11

Ahh, mam to,

TERM jest wysyłany do procesu zbyt wcześnie, zanim interpreter Ruby była w stanie ustalić haka. Więc to ją kończy.

a sleep 1 przed kill -TERM #{pid} sortuje problem.

+1

Trzecia z perspektywy czasu. :) 'Thread.pass' może również działać zamiast' sleep', ale znowu może być zależny od systemu. – moonfly

+0

co masz na myśli mówiąc "ustal haczyk"? czy Process.spawn powrócił z pid, czy proces nie powinien być natychmiast podatny na sygnały? –

+0

ohhh interpreter ruby ​​wywoływany wewnątrz procesu jeszcze się nie rozwinął ... gówno. –

Powiązane problemy