想像一下:你开启了一个程式(可能来自于你的桌面选单或者命令列),然后开始使用这个程式,没想到程式会锁死、停止执行、或者意外宕机。你尝试再次执行该程式,但是它反馈说原来的程序没有完全关闭。
你该怎么办?你要结束程序。但该如何做?不管你信与不信,最好的解决方法大都在命令列里。值得庆幸的是, Linux 有供使用者杀死错误的程序的每个必要的工具,然而,你在执行杀死程序的命令之前,你首先需要知道程序是什么。该如何处理这一类的任务。一旦你能够掌握这种工具,它实际是十分简单的……
让我来介绍给你这些工具。
我来概述的步骤是每个 Linux 发行版都能用的,不论是桌面版还是站群服务器版。我将限定只使用命令列,请开启你的终端开始输入命令吧。
定位程序
杀死一个没有响应的程序的第一个步骤是定位这个程序。我用来定位程序的命令有两个:top 和 ps 命令。 top 是每个系统管理员都知道的工具,用 top 命令,你能够知道到所有当前正在执行的程序有哪些。在命令列里,输入 top 命令能够就看到你正在执行的程式程序(图 1)

图 1: top 命令给出你许多的资讯。
从显示的列表中你能够看到相当重要的资讯,举个例子,Chrome 浏览器反映迟钝,依据我们的 top 命令显示,我们能够辨别的有四个 Chrome 浏览器的程序在执行,程序的 pid 号分别是 3827 、 3919 、 10764 和 11679 。这个资讯是重要的,可以用一个特殊的方法来结束程序。
尽管 top 命令很是方便,但也不是得到你所要资讯最有效的方法。 你知道你要杀死的 Chrome 程序是那个,并且你也不想看 top 命令所显示的实时资讯。 鉴于此,你能够使用 ps 命令然后用 grep 命令来过滤出输出结果。这个 ps 命令能够显示出当前程序列表的快照,然后用 grep 命令输出匹配的样式。我们通过 grep 命令过滤 ps 命令的输出的理由很简单:如果你只输入 ps 命令,你将会得到当前所有程序的列表快照,而我们需要的是列出 Chrome 浏览器程序相关的。所以这个命令是这个样子:

ps aux | grep chrome

这里 aux 选项如下所示:

a = 显示所有使用者的程序
u = 显示程序的使用者和拥有者
x = 也显示不依附于终端的程序

当你搜寻图形化程式的资讯时,这个 x 引数是很重要的。
当你输入以上命令的时候,你将会得到比图 2 更多的资讯,而且它有时用起来比 top 命令更有效。

图 2:用 ps 命令来定位所需的内容资讯。
结束程序
现在我们开始结束程序的任务。我们有两种可以帮我们杀死错误的程序的资讯。

程序的名字
程序的 ID(PID)

你用哪一个将会决定终端命令如何使用,通常有两个命令来结束程序:

kill – 通过程序 ID 来结束程序
killall – 通过程序名字来结束程序

有两个不同的讯号能够传送给这两个结束程序的命令。你传送的讯号决定著你想要从结束程序命令中得到的结果。举个例子,你可以传送 HUP(挂起)讯号给结束程序的命令,命令实际上将会重启这个程序。当你需要立即重启一个程序(比如就守护程序来说),这是一个明智的选择。你通过输入 kill -l 可以得到所有讯号的列表,你将会发现大量的讯号。

图 3: 可用的结束程序讯号。
最经常使用的结束程序的讯号是:

Signal Name
Single Value
Effect

SIGHUP
1
挂起

SIGINT
2
键盘的中断讯号

SIGKILL
9
发出杀死讯号

SIGTERM
15
发出终止讯号

SIGSTOP
17, 19, 23
停止程序

好的是,你能用讯号值来代替讯号名字。所以你没有必要来记住所有各种各样的讯号名字。
所以,让我们现在用 kill 命令来杀死 Chrome 浏览器的程序。这个命令的结构是:

kill SIGNAL PID

这里 SIGNAL 是要传送的讯号,PID 是被杀死的程序的 ID 。我们已经知道,来自我们的 ps 命令显示我们想要结束的程序 ID 号是 3827 、 3919 、 10764 和 11679 。所以要传送结束程序讯号,我们输入以下命令:

kill -9 3827
kill -9 3919
kill -9 10764
kill -9 11679

一旦我们输入了以上命令,Chrome 浏览器的所有程序将会成功被杀死。
我们有更简单的方法!如果我们已经知道我们想要杀死的那个程序的名字,我们能够利用 killall 命令传送同样的讯号,像这样:

killall -9 chrome

附带说明的是,上边这个命令可能不能捕捉到所有正在执行的 Chrome 程序。如果,执行了上边这个命令之后,你输入 ps aux | grep chrome 命令过滤一下,看到剩下正在执行的 Chrome 程序有那些,最好的办法还是回到 kIll 命令通过程序 ID 来传送讯号值 9 来结束这个程序。
结束程序很容易
正如你看到的,杀死错误的程序并没有你原本想的那样有挑战性。当我让一个顽固的程序结束的时候,我趋向于用 killall 命令来作为有效的方法来终止,然而,当我让一个真正的活跃的程序结束的时候,kill 命令是一个好的方法。