【问题标题】:Killing process group from Ruby kills my whole computer从 Ruby 中杀死进程组会杀死我的整个计算机
【发布时间】:2017-07-11 07:24:05
【问题描述】:

我有一个生成大量子进程的脚本 (script.sh)。如果我通过 ./script.sh 从 shell 运行脚本,我可以通过

杀死整个进程树
kill -- -<PID> 

其中 PID 是 script.sh 进程的进程 ID(这显然等于组 ID)。

但是,如果我通过 Ruby 从 Ruby 生成脚本

pid = Process.spawn(script.sh) 

我无法杀死进程树。

Process.kill(9,pid) 

只杀死父进程。更糟糕的是,以下

Process.kill(9,-Process.getpgid(pid))  ### Don't try this line at home

终止我的计算机。 试图通过

杀死进程
system("kill -- -#{pid}") 

也失败了。 我应该如何从 Ruby 中杀死这个进程树?

【问题讨论】:

  • 你是否在你的 ruby​​ 脚本中交叉检查了 pid 的值
  • 是的,Spawn 的 pid 与我在 ps ax 中看到的 pid 对应
  • 我会尝试派生一个子进程以在其中运行脚本并杀死它的 pid,就像在 kill example 中一样。

标签: ruby linux


【解决方案1】:

我想我已经找到了解决方案。将进程生成为

pid = Process.spawn(script.sh, :pgroup => true)

使我能够通过

杀死进程组
Process.kill(9,-Process.getpgid(pid))

默认情况下,它看起来像 bash 对进程进行分组,而 Spawn 默认情况下不启用此功能。

【讨论】:

  • 请注意,像这样设置pgroup: true 有很大的副作用。这意味着子进程不会在停止您的 Ruby 脚本时自动关闭,例如Ctrl-C。您必须确保手动杀死它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
相关资源
最近更新 更多