ruby – 为什么我的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"
""

但是……如果我只是在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将不再杀死它之后从原始进程中终止该进程.

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

解决方法

啊,我明白了,

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

在杀死之前睡眠1 -TERM#{pid}对问题进行排序.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...