12.4 终止正在运行的进程

kill

有时程序也会淘气,不响应正常的关闭请求。在GUI(图形用户界面)中,多次点击Close按钮,但没有任何事情发生;或是在shell中按Ctrl+C键,也没能停止正在运行的命令。当发生这种问题时,就需要使用kill命令了。

kill命令能够向进程发出多种信号,例如,“请关闭进程,同时清理占用的东西”、“请尽可能快地关闭进程”以及“马上关闭”。下面将主要介绍这三种重要的信号。当使用kill命令时,可以用一个数字或单词来指定关闭进程的紧急程度,如表12-2所示。 表12-2 与kill命令关联的常用信号

信号编号 信号单词 含  义
-1 -HUP (hang up,挂起) 控制进程已经死了,关闭进程(如果用于系统服务,会导致重新加载配置文件并重启)
-15 -TERM 正常中止进程,清除将要失控的进程和文件
-9 -KILL 停止任何正在进行的处理,马上关闭

通常,应该先试试-15(其实,如果kill命令没有使用任何选项,它就是默认值)。这样,程序就可以关闭依赖于它的任何其他程序,关闭由它打开的文件,等等。在耐心地等待了一会儿后(当然“一会儿”有多长,完全是主观的),进程仍然在完全不受控制地运行,或者仍然没有响应,这时就可以使出更大的杀手锏,使用-9选项。-9选项相当于强制中断一个正在运行的进程(即使这个进程还在处理它的作业),从而可能在系统中遗留下失去控制的临时文件或进程,所以这绝对不是个好想法。

-1(或-HUP)选项,主要用于Samba或无线连接之类的服务。虽然这个选项可能不经常用,但应该了解它的含义。

如果gvim看起来在系统中不动了(通常,它都运行得非常好,这里只是为了做个演示),可以进行以下处理:

  1. $ ps U scott
  2. PID TTY STAT TIME COMMAND
  3. 14928 ? S 0:00 /opt/ooo2/program/soffice-writer
  4. 14957 ? Sl 0:42 /opt/ooo2/program/soffice.bin-writer
  5. 4688 pts/4 S+ 0:00 ssh scott@humbug.machine.com
  6. 26751 ? Z 0:00 [wine-preloader] <defunct>
  7. 27921 ? Ss 0:00 /usr/bin/gvim
  8. 27955 pts/5 R+ 0:00 ps U scott
  9. $ kill 27921
  10. $ ps U scott
  11. PID TTY STAT TIME COMMAND
  12. 14928 ? S 0:00 /opt/ooo2/program/soffice-writer
  13. 14957 ? Sl 0:42 /opt/ooo2/program/soffice.bin-writer
  14. 4688 pts/4 S+ 0:00 ssh scott@humbug.machine.com
  15. 26751 ? Z 0:00 [wine-preloader] <defunct>
  16. 27955 pts/5 R+ 0:00 ps U scott

要关闭gvim,首先用ps命令找到gvim的PID,在这个例子中是27921。然后关闭那个PID(记住,kill命令默认使用TERM信号),并用ps命令再检查一下。好的,gvim已经不在了。

说明 为什么不关闭PID 26751这个进程呢(它的STATZ,表明该进程处于“僵尸”状态)?因为即使-9选项对“僵尸”进程也没有效果,这样的进程早已经死掉了,因此kill命令对它也无能为力。重启是唯一能够解决这种问题的办法,不过这样的问题通常是无关紧要的。