为什么我的TERM没有被捕获

时间:2014-10-09 00:53:06

标签: ruby linux unix

我有这个示例代码:

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"
""

然而 ...如果我只是在spawn之后睡觉并从另一个进程发出kill,则会按预期捕获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

此外,如果我尝试然后kill来自原始进程的进程被陷入处理程序后TERM将不再杀死它。

这里发生了什么,为什么TERM没有从父母那里正确地送到我的孩子的过程?

1 个答案:

答案 0 :(得分:11)

啊,我明白了,

在Ruby解释器能够建立挂钩之前,TERM过早地被发送到进程。所以它终止了它。

sleep 1之前kill -TERM #{pid}对问题进行排序。