如何杀死进程和子进程?


9

我问 了一个问题,以了解如何从Python的子流程模块中获取多行消息。

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

为了杀死小舌,我得到了ps aux的pid | grep小节并运行kill -9 PID。还有其他方法可以杀死python和gnuchess进程吗?


8
随机旁注:您可以使用pkill名字杀死进程,因此您的ps aux | grep gnuchesskill -9 PID可以成为pkill -9 gnuchess
Michael Mrozek

Answers:


10

如果程序配合,则有一种标准方法。运行kill -- -4242是父进程的pid。这会将信号发送到由进程42引导的进程组中的所有进程(pid表示进程组之前的减号)。

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

Gnuchess可能在自己的进程组中,这是因为它使自己成为了会话领导者(但我不知道为什么会这样做),或者因为您已经将它双叉了(Python派生了一个分支,它分支了Gnuchess)。双叉也许是可以避免的,但是如果不看代码我不会告诉你怎么做。


查找gnuchess过程pid的合理可靠且符合POSIX的方式是

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

特定的unix变体可能有更好的方法来实现此目的,例如pgrep


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.