有时,发送一个SIGTERM到一个进程会导致它发送SIGTERM到它的所有subprocess。 但是,有时这是行不通的。
是否有一个命令或实用程序,可以让我同时杀死进程及其所有subprocess? 我通常会手动将所有的pid收集到一个kill命令中,但是感觉很愚蠢。
这个SO问题问如何用perl来做到这一点,但任何能够完成这项工作的东西都会很棒。
这个问题涵盖了这一点。
假设这些进程共享一个会话标识符(除非他们明确地调用setsid(),否则他们应该使用pkill通过会话来终止它们:
user@machine:~> ps -o pid,sess,cmd -U user PID SESS CMD 12804 12804 -bash 12916 12804 ps -o pid,sess,cmd -U user user@machine:~> sh sh-3.00$ sh sh-3.00$ sh sh-3.00$ sh sh-3.00$ sh sh-3.00$ sh sh-3.00$ ps -o pid,sess,cmd -U user PID SESS CMD 12804 12804 -bash 12920 12804 sh 12921 12804 sh 12922 12804 sh 12924 12804 sh 12926 12804 sh 12928 12804 sh 12937 12804 ps -o pid,sess,cmd -U user sh-3.00$
如果从另一个terminal,我做:
pkill -9 -s 12804
那么一切都是一举死去的。
同样可以通过进程组来杀死,尽pipe对于许多低于父级的孩子来说,这往往更有用,而不是相关进程链。
通常情况下,响应客户端应该收到一个sigterm并closures,从而终止其所有的分支subprocess。 另一方面,如果客户端没有响应,正常的终止信号可能不会引起响应。
所以你继续发送一个SIGKILL,告诉系统本身让进程停止,现在 – 它可以做大部分时间,除非进程处于不可中断的睡眠状态,比如等待一些I / Oinput或类似。
在这种情况下,即使是SIGKILL也不会对这个过程做任何事情。 孩子的过程可能会处于相似的迟缓状态。
有一个边界情况下,父进程可能会很好地终止,但subprocess不是可以驱动的。 那么你将最终得到一个僵尸进程,因为它的父亲不在了,所以无法清理,但是它没有任何回应。 摆脱这些的唯一方法是重新启动; 在大多数情况下,它们是非常无害的,因为他们所做的唯一事情就是占用一个PID,而任何他们试图使用的套接字已经消失了。
如果我想杀死Firefox的进程树,那么是否有可能通过上面的命令“pkill -9 -s firefox”