kill命令很容易让人产生误解,以为它仅仅是用来杀死进程的。我们来看一下man page对它的解释:kill - sned a signal to a process。

从官方的解释不难看出,kill是向进程发送信号的命令。当然我们可以向进程发送一个终止运行的信号,此时的kill命令才是实至名归。事实上如果我们不给kill命令传递信号参数,它默认传递终止进程运行的信号给进程。这是kill的最主要用法,也是本文要介绍的内容。

一般情况下,终止一个前台进程使用Ctrl + C 就可以了。对于一个后台进程就必须用kill命令来终止。我们会先使用ps, top等命令来获得进程的PID, 然后使用kill命令来杀掉该进程。

kill命令格式

  1. kill [options] <pid> [...]
  2. <pid> []: 把信号发送给列出的所有进程
  3. options:
  4. -<signal> : 指定发送给进程的信号,指定信号的名称或号码都可以
  5. -l : 列出所有信号的名称和号码。

kill命令详情

既然kill命令是用来向进程发送信号的,那就让我们来看看都有哪些信号可以发送给进程

  1. kill -l

image.png

这是所有内核可以发给进程的信号,但是这些信号里面只有第9种信号可以无条件地终止进程,进程对其他信号都有权利忽略。而且这么多的信号中常用的也不多。下面我们来看看常见的几种信号的含义:

代号 名称 内容
1 SIGHUP 启动被终止的程序,可让该进程重新读取自己的配置文件,类似重新启动
2 SIGINT 相当于用键盘输入 [ctrl]-c 来中断一个程序的进行
9 SIGKILL 代表强制中断一个程序的进行,如果该程序进行到一半,那么尚未完成的部分可能会有“半产品”产生,类似 vim会有 .filename.swp 保留下来
15 SIGTERM 以正常的方式来终止该程序。由于是正常的终止,所以后续的动作会将他完成。不过,如果该程序已经发生问题,就是无法使用正常的方法终止时,输入这个 signal 也是没有用的
19 SIGSTOP 相当于用键盘输入 [ctrl]-z 来暂停一个程序的进行, z是挂起的意思

常用命令

  1. kill -15 pid
  2. kill pid

这条命令发信号让进程正常退出。所谓的正常退出是指按应用程序自己的退出流程完成退出,这样就可以清理并释放资源。比如 vim 程序,如果是正常的退出,就会删除掉临时文件 *.swp。既然信号 15 是退出进程的正确方式,那它也应该是最常用的方式,因而我们可以省略参数 -15。

  1. kill -9 pid

当进程出现了异常状况,不能通过信号15正常退出时,我们就需要通过非常的手段直接终结掉进程。所谓的非常手段就是传递信号 9 给目标进程。

总结

使用信号15是安全的,而信号9则是处理异常进程的最后手段

参考:kill 命令的用途