killall 不会杀死所有人,而且很少杀死任何人,那么命令是什么?

killall 不会杀死所有人,而且很少杀死任何人,那么命令是什么?

我偶尔会使用该killall命令来终止进程。之所以说偶尔,是因为在某些情况下它对我来说不起作用。

最近的一个例子是 thunderbird,内存中大约有 5 个实例,所以我决定使用该killall命令。它杀死了 2 个进程,但内存中仍留有 3 个。再次尝试,发现这 3 个进程仍然存在。

所以我手动使用kill -9命令通过进程号杀死每个进程。成功了。

我主要使用该kill -9命令,因为它有效。该killall命令让我失望了很多次,我根本不想使用它。但它不起作用肯定是有原因的。我使用它错了吗?

我知道还有其他类似的命令pkill,但我很想知道为什么该killall命令不能按预期工作。我甚至尝试过只终止一个进程,但结果总是不尽如人意。但该kill -9命令每次都能正常工作。

有任何想法吗?

PS:sudo没什么区别

答案1

来自 killall 的手册页

killall 向所有运行指定命令的进程发送信号。如果没有指定信号名,则发送 SIGTERM。

当你执行 时kill -9,你正在发送 SIGKILL 信号。如果你想用 killall 发送 SIGKILL,你需要执行

killall -s SIGKILL <PROCESSNAME>

很好地解释了 SIGKILL 和 SIGTERM 之间的区别(以及为什么你应该首先尝试 SIGTERM)

http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/

在 Unix 系统上使用 kill 向进程发送信号对于大多数系统管理员来说并不是一个新话题,但我曾多次被问到 kill 和 kill -9 之间的区别。

任何时候对进程使用 kill,实际上都是在向进程发送信号(在几乎所有情况下都是如此——我很快就会讲到这一点)。标准 C 应用程序有一个头文件,其中包含进程在收到特定信号时应遵循的步骤。您可以通过查看 kill 的手册页来获取系统上可用信号的完整列表。

考虑这样的命令:

kill 2563

这将向进程发送一个名为 SIGTERM 的信号。一旦进程收到通知,可能会发生以下几种情况:

  • 该过程可能会立即停止
  • 清理资源后,该过程可能会在短暂延迟后停止
  • 该过程可能会无限期地持续运行

应用程序可以决定在收到 SIGTERM 后要做什么。虽然大多数应用程序会清理资源并停止,但有些应用程序可能不会。应用程序可以配置为在收到 SIGTERM 时执行完全不同的操作。此外,如果应用程序处于不良状态(例如等待磁盘 I/O),它可能无法对发送的信号采取行动。

当应用程序不响应 SIGTERM 时,大多数系统管理员通常会采取更为突然的信号:

kill -9 2563

-9 告诉 kill 命令您要发送信号 #9,即 SIGKILL。有了这个名字,很明显这个信号的重要性要大一些。

尽管 SIGKILL 与 SIGTERM 在同一个信号头文件中定义,但进程无法忽略它。事实上,进程甚至不知道 SIGKILL 信号,因为该信号直接发送到内核 init。此时,init 将停止进程。进程永远没有机会捕获信号并对其采取行动。

但是,在某些情况下,内核可能无法成功终止进程。如果进程正在等待网络或磁盘 I/O,内核将无法停止它。僵尸进程和处于不可中断睡眠状态的进程也无法被内核停止。需要重新启动才能从系统中清除这些进程。

当您向 thunderbird 进程发送 killall (SIGTERM) 时,您请求停止这些进程。其中一些进程无法正常工作(这可能是您首先需要终止它们的原因),因此它们无法对 SIGTERM 信号采取行动。

答案2

killall接受与 相同的大部分语法kill。特别是,无需编写任何花哨的东西即可实现killall的等效效果kill -9。这很好用:

killall -9 thunderbird

(当然,如上所述,您通常不愿意使用killall -9或等效地killall -KILL,除非已经尝试过其他措施但没有成功。)

答案3

对于那些寻求快速答案的人:

sudo killall -s SIGTERM processname

相关内容