我有这个示例代码:
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`
它产生了一个捕获TERM的过程,然后发送一个TERM给它。
麻烦的是,TERM没有在这里被捕获,进程只是终止。
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" ""
但是 ,如果我在产卵后只是睡觉,并从不同的过程中发出杀手,TERM将按预期捕获。
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
其他shell
kill -TERM PID
产量
GOT TERM
更进一步的,如果我试图从发起进程中终止它被困在处理程序TERM之后终止进程将不再杀死它。
这里发生了什么,为什么TERM不能正确地从父母传递给我的subprocess呢?
啊,我知道了,
在Ruby解释器能够建立钩子之前,TERM被发送到这个进程太早了。 所以它终止了。
kill -TERM #{pid}
之前的sleep 1
将问题排序。