为什么我的TERM不被捕获

我有这个示例代码:

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将问题排序。