[英]Why is my TERM not being captured
我有这个示例代码:
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
其他外壳
kill -TERM PID
产量
GOT TERM
更进一步,如果我尝试在陷阱处理器TERM将不再杀死它之后从原始进程中kill
该进程。
这里发生了什么,为什么TERM没有从父母那里正确地送到我的孩子的过程?
啊,我明白了,
在Ruby解释器能够建立挂钩之前,TERM被过早地发送到进程。 所以它终止了它。
在kill -TERM #{pid}
之前sleep 1
kill -TERM #{pid}
对问题进行排序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.