从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信号起作用。