我有一个脚本(script.sh),它会生成大量子进程。如果我通过 ./script.sh 从 shell 运行脚本,我可以通过
杀死整个进程树kill -- -<PID>
其中 PID 是 script.sh 进程的进程 ID(这显然等于组 ID)。
但是,如果我通过 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 中杀死这个进程树?
最佳答案
我想我已经找到了解决方案。生成进程为
pid = Process.spawn(script.sh, :pgroup => true)
使我能够通过
终止进程组Process.kill(9,-Process.getpgid(pid))
看起来 bash 默认情况下会分组进程,而 Spawn 默认情况下不会启用此功能。
关于ruby - 从 Ruby 中杀死进程组会杀死我的整台计算机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45027973/