如何杀死进程和子进程?

如何杀死进程和子进程?

我问 一个问题了解如何从 Python 的 subprocess 模块获取多行消息。

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

为了杀死 gnuchess,我得到了 pid辅助 | grep gnuchess并运行杀死-9 PID。还有其他方法可以杀死 python 和 gnuchess 进程吗?

答案1

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

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

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


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

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

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

答案2

尝试:

pkill <processname>

相关内容