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
看起来在系统中不动了(通常,它都运行得非常好,这里只是为了做个演示),可以进行以下处理:
$ ps U scott
PID TTY STAT TIME COMMAND
14928 ? S 0:00 /opt/ooo2/program/soffice-writer
14957 ? Sl 0:42 /opt/ooo2/program/soffice.bin-writer
4688 pts/4 S+ 0:00 ssh scott@humbug.machine.com
26751 ? Z 0:00 [wine-preloader] <defunct>
27921 ? Ss 0:00 /usr/bin/gvim
27955 pts/5 R+ 0:00 ps U scott
$ kill 27921
$ ps U scott
PID TTY STAT TIME COMMAND
14928 ? S 0:00 /opt/ooo2/program/soffice-writer
14957 ? Sl 0:42 /opt/ooo2/program/soffice.bin-writer
4688 pts/4 S+ 0:00 ssh scott@humbug.machine.com
26751 ? Z 0:00 [wine-preloader] <defunct>
27955 pts/5 R+ 0:00 ps U scott
要关闭gvim
,首先用ps
命令找到gvim
的PID,在这个例子中是27921。然后关闭那个PID(记住,kill
命令默认使用TERM
信号),并用ps
命令再检查一下。好的,gvim
已经不在了。
说明 为什么不关闭PID 26751这个进程呢(它的
STAT
是Z
,表明该进程处于“僵尸”状态)?因为即使-9
选项对“僵尸”进程也没有效果,这样的进程早已经死掉了,因此kill
命令对它也无能为力。重启是唯一能够解决这种问题的办法,不过这样的问题通常是无关紧要的。