killall不能杀死所有人,很少杀死人,那么命令是什么?


12

我偶尔使用killall命令杀死进程。我之所以说不定是因为在某些情况下它对我没有用。

最近的一个例子是雷鸟,内存中大约有5个实例,因此我决定使用该killall命令。它杀死了2个进程,还有3个仍留在内存中。再次尝试,三人仍然在那里。

因此,我手动使用该kill -9命令通过其pid杀死了每个进程。那行得通。

我主要使用该kill -9命令,因为它可以正常工作。该killall命令使我失望了很多次,我只是不打扰使用它。但是一定有一个为什么它不起作用的原因。我使用错了吗?

我知道还有其他类似的命令,pkill但不胜感激,为什么该killall命令无法按预期运行。我什至试图杀死一个过程,这是一个命中注定的事情。但是该kill -9命令每次都起作用。

有任何想法吗?

PS:sudo没什么关系

Answers:


22

从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将停止该过程。这个过程永远没有机会抓住信号并采取行动。

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

当您将killall(SIGTERM)发送给雷鸟进程时,您要求停止这些进程。其中一些进程无法正常工作(可能是为什么您首先需要杀死它们),因此它们无法对SIGTERM信号起作用。


关于为什么它只杀死了一些雷鸟实例的任何猜测?
Meer Borg

@Doogfar参见我编辑过的文章(或我链接的页面)
tgm4883 2013年

谢谢,这也解释了为什么我的雷鸟被破坏,杀死-9太残酷了
Meer Borg 2013年

仍然不能总是正常工作。
Craig Hicks

4

killall接受与相同的大多数语法kill。特别是,不需要写任何花哨的东西就可以killall做等同于kill -9。这很好用:

killall -9 thunderbird

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


仍然不能总是正常工作,因此必须有其他东西。
Craig Hicks
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.