ruby - 为什么我的 TERM 没有被捕获

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

但是 ... 如果我只是在产卵后 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 1kill -TERM #{pid} 之前解决问题。

关于ruby - 为什么我的 TERM 没有被捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26268707/

相关文章:

ruby - 从 Web 浏览器编程 ruby

ruby - 为什么 `<=` 和 `>=` 与 `<` 、 `>` 和 `==` 无关?

ruby - 使用 ruby​​ 对字符串进行按位运算

linux - 如何判断linux设备的事件?

Linux:ioctl/FIONREAD 返回 0 字节可用在/dev/random?

java - 有没有一种方法可以使用 Cygwin 运行 shell 脚本并对 java 命令使用正确的路径分隔符

macos - 通过终端复制文件列表

ruby - 按空格拆分字符串

java - 在 Linux 系统上安装 Spring Boot 应用程序

node.js - npm install 好像不对