7.4 进程的终止:kill、killall

要终止一个进程,需要通过kill、killall等命令来实现。比如说有部分进程由于某种原因已经死掉或者工作异常,或者要停止一些非关键或非数据业务的进程,那么这时就需要使用这些命令来终止进程。这些命令的原理都是向内核发送一个系统操作信号以及某个进程的标识号,使得内核对指定标识号的进程进行相应的操作。

一般来说,kill命令需要和ps命令联合使用。原因是kill后面跟的应该是需要被终止的进程的PID。典型用法是使用ps查出进程的PID,然后使用kill将其终止。kill的使用方法如下:


  1. [root@localhost ~]# kill [
  2. 信号代码]
  3. 进程ID

假设系统中的dhcpd进程由于某种原因需要终止,那么首先要查找到该进程的PID(从下面的输出中可以看到该PID为2877),然后kill这个PID。完成这个操作后再看dhcpd进程,就已经不在了。


  1. [root@localhost ~]# ps -ef | grep dhcp
  2. root 2877 1 0 18:59 ? 00:00:00 usrsbin/dhcpd
  3. #
  4. 这里找出dhcpd
  5. PID
  6. 2877
  7. #
  8. 有个更快速的方式来寻找进程的PID
  9. ,即使用pidof
  10. 命令
  11. #[root@localhost ]# pidof dhcpd
  12. #2877
  13. [root@localhost ]# kill 2877

命令kill后可以跟的信号代码一共有64种,使用kill-l就可以看到具体有哪些,如图7-4所示。但是常用的一般只有3个,即HUP(1)、KILL(9)、TERM(15),分别代表重启、强行杀掉、正常结束。

7.4 进程的终止:kill、killall - 图1

图7-4 kill命令可用的信号代码

信号1代表重启,假设需要重启系统中的httpd服务,先查主httpd进程的PID号,这里为2935,如图7-5所示(注意,在图7-5中,第一次查询的时候,发现有若干个httpd进程,但是主进程只有一个,即由root启动的、PID为2935的第一个进程,其他的都是该进程的子进程)。使用kill-1 2935后,再查看httpd进程的时候,发现主进程的PID没有变化,而子进程的PID都在同一时刻发生了变化,这说明主进程确实经过了重启。这也说明,使用kill-1重启进程的时候实际上是不会改变主进程的PID的,也就是说只是发生了原地重启,或者说“软重启”。

7.4 进程的终止:kill、killall - 图2

图7-5 使用kill重启进程

前面成功地使用不带信号代码的kill停止了dhcpd进程,但实际上有一些进程因为运行中出现问题而无法通过这种方式停止,在这种情况下就需要使用-9参数强行停止该进程了,其效果是立即杀死进程,而且该信号无法被阻塞或忽略。但是这个命令也有其天然的危险,就是进程可能会直接被系统终止,而没有清理之前申请的内存,这会造成一定程度的“内存泄露”,因此一般情况下不建议使用。而-15这个参数就比较温和了,它会使进程正常退出,它也是Linux默认的程序中断信号(也就是在不加参数的情况下默认使用的信号)。

由于使用kill命令时要先查询到想要终止的进程的PID,也就是说操作对象是数字,相对来说会比较麻烦,而且在实际的工作中,如果看错了PID其后果是无法估计的(想象一下,如果看错或是输错了PID,恰巧将一个非常重要的应用程序给kill了,那就无异于一场灾难)。事实上,想要终止进程时还有第二个命令可以选择,即killall命令,它可以直接使用进程的名字而不是PID,如果要停止系统中所有的httpd进程,那么只要按照以下方法操作就可以了:


  1. [root@localhost ~]# killall httpd

这个命令不但简单而且更为安全。