如何同时杀死进程和子进程?

pro*_*eek 9 process kill

我问 了一个问题,想知道如何从 Python 的 subprocess 模块中获取多行消息。

问题是在测试过程中,我不得不杀死运行gnuchess进程的python进程。在命令行中使用 ^c 似乎会杀死 python 进程,但不会杀死 gnuprocess。

为了杀死 gnuchess,我使用ps aux获取 pid | grep gnuchess并运行kill -9 PID。是否有其他方法可以同时杀死 python 和 gnuchess 进程?

Gil*_*il' 12

有一个标准的方法,如果程序合作。运行kill -- -42,其中 42 是父进程的 pid。这会向进程 42 领导的进程组中的所有进程发送一个信号(pid 前的减号表示进程组)。

通常,如果您从 shell 提示符运行 python 脚本并且它只是 fork gnuchess,那么这两个进程应该保留在同一个进程组中。但这似乎并非如此,因为Ctrl+C发送SIGINT到整个前台进程组。

Gnuchess 可能在它自己的进程组中,因为它使自己成为会话领导者(但我不知道它为什么会这样做),或者因为您已经对它进行了双分叉(python 分叉了一个分叉 gnuchess 的外壳)。双叉可能是可以避免的,但是如果没有看到您的代码,我无法告诉您如何避免。


一种相当可靠且符合 POSIX 标准的查找gnuchess进程pid 的方法是

gnuchess_pids=$(ps -A -o pid= -o cmd= | awk '$2 ~ /(^|\/)gnuchess$/ {print $1}')
Run Code Online (Sandbox Code Playgroud)

特定的 Unix 变体可能有更好的方法来实现这一点,例如pgrep.