我有这个示例代码:
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"
""
但是 ... 如果我只是在产卵后 sleep 并从不同的进程发出 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
此外,如果我尝试 kill
原始进程陷入处理程序后的进程,TERM 将不再杀死它。
这是怎么回事,为什么 TERM 没有从父进程正确传递到我的子进程?
最佳答案
我明白了,
在 Ruby 解释器能够建立 Hook 之前,TERM 被发送到进程的时间过早。所以它终止了它。
sleep 1
在 kill -TERM #{pid}
之前解决问题。
关于ruby - 为什么我的 TERM 没有被捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26268707/