举个栗子

好读书,不求甚解

在Unix系统中使用kill命令给进程发送信号对于大多数系统管理员来说不是什么新鲜事,但是对于killkill -9有什么不同,我还是被询问过很多次。

在任何时候,你在一个进程上使用kill命令,实际上是你发送了一个信号给进程。标准的C应用程序有这样一个header file,它包含了一些当进程收到一个特殊信号之后需要干什么的步骤。你可以在你的操作系统上使用man kill查看完整的可使用的信号列表。

让我们来看这样一个命令

1
kill 2563

它将发送一个叫做SIGTERM的信号进程。 一进程收到这个信号,有几个不同的事情可能要发生:

  • 进程可能立刻停止
  • 进程可能短暂延迟清理完进程资源之后再停止
  • 进程可能仍然保持运行

进程能够决定在它收到一个SIGTERM信号之后它想做什么,而大多数进程会先清理它们使用的资源然后在停止工作,也有些不是这样。进程也有可能被配置成收到SIGTERM后做一些完全不同的事情。如果进程处在一个比较糟糕的状态下,例如等待磁盘I/O,它有可能收到信号后不会执行任何相应的动作。

当给一个进程发送SIGTERM没有反映的时候,大多数系统管理员都会寻求一个更加果断的信号。

1
kill -9 2563

-9将会告诉kill命令你想发送#9信号(也就是SIGKILL)。从字面意思就可以看到,这个信号很明显要更加的厉害些。

虽然SIGKILLSIGTERM被定义在相同的header file中,但是SIGKILL是无法被进程忽略的。事实上,进程还没有意识到SIGKILL,因为SIGKILL是直奔内核的init进程。因此,init将停止进程。进程绝对不会得到任何机会去捕获信号,然后做出响应。

尽管如此,在一些特定的情况下内核也不能成功的停止进程。如果进程正在等待网络或者磁盘I/O,内核不能停止掉进程。僵尸进程和处在不间断睡眠状态的进程也不能被内核停止。需要重新启动来清除系统中的这些进程。

本文作者 : Kevalin
本文使用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议
本文链接 : https://kevalin.github.io/2016/08/07/SIGTERM-vs-SIGKILL/