如何在Linux中杀死进程树?[关闭]


14

有时,将SIGTERM发送到进程将导致其将SIGTERM发送到其所有子进程。但是,有时这不起作用。

是否有命令或实用程序可以让我同时杀死一个进程及其所有子进程?我通常会手动将所有pid收集到一个kill命令中,但是感觉很愚蠢。

这样的问题问如何用perl做到这一点,但是任何可以完成工作的东西都很棒。


无论出于何种原因,看起来pkill -9都比强大pkill
Andrew

Answers:



13

假设进程共享一个会话标识符(除非已明确调用了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$

如果从另一个终端我这样做:

pkill -9 -s 12804

然后一切都死于一扑。

您可以按进程组类似地进行杀死,尽管这对于许多在父级下一级而不是相关进程链下的子级来说更有用。


2

通常,响应的客户端应收到一个sigterm,然后退出,从而终止其所有分叉的子进程。另一方面,如果客户端没有响应,则正常的终止信号可能不会引起响应。

因此,您然后继续发送SIGKILL,该消息告诉系统本身立即停止该进程-大部分时间它都可以执行此操作,除非该进程处于不间断的睡眠状态,例如等待某些I / O。输入或类似内容。

在这种情况下,即使是SIGKILL最终也将对该过程不做任何事情。子进程可能会处于类似的延迟状态。

在边界情况下,父进程可能会很好地终止,但子进程不可终止。然后,您将遇到一个僵尸进程,该进程由于其父亲已去世而无法清除,但它没有任何响应。摆脱这些麻烦的唯一方法是重新启动。但是,在大多数情况下,它们是完全无害的,因为它们所做的唯一事情就是占用PID,而他们尝试使用的任何套接字都已经枯竭了。


2

如果我想杀死Firefox的进程树,那么可以通过上述命令“ pkill -9 -s firefox”杀死它

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.