killall并没有全部杀死而且很少杀人,那么命令是什么?

我偶尔使用killall命令来杀死进程。 我之所以说是偶然的,在某些情况下它对我没用。

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

所以我手动使用kill -9命令通过它们的pid杀死每个进程。 那很有效。

我主要使用kill -9命令。 killall命令让我失望了很多次,我只是不打扰使用它。 但必须有一个原因,它不起作用。 我用错了吗?

我知道还有像pkill这样的其他命令,但我很高兴理解为什么killall命令不能按预期工作。 我甚至试图杀死一个进程,这是一个打击和错过的事情。 但kill -9命令每次都有效。

有任何想法吗?

PS: sudo没有什么区别

从killall的手册页

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

当您执行kill -9 ,您正在发送SIGKILL信号。 如果你想发送带有killall的SIGKILL,你需要这样做

 killall -s SIGKILL  

很好地解释了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相同的信号头文件中定义,但该过程不能忽略它。 实际上,由于信号直接进入内核init,因此该过程甚至不知道SIGKILL信号。 此时,init将停止该过程。 这个过程永远不会有机会捕获信号并采取行动。

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

当您将killall(SIGTERM)发送到thunderbird进程时,您请求停止这些进程。 其中一些进程无法正常工作(可能为什么你需要先杀掉它们),所以它们无法对SIGTERM信号起作用。

killall接受大多数与kill相同的语法。 特别是,没有必要编写任何想要使killall相当于kill -9 。 这很好用:

 killall -9 thunderbird 

(当然,正如所讨论的那样,你通常不愿意使用killall -9或等效的killall -KILL ,除非已经尝试了其他措施但没有成功。)