如何在 Linux 系统中结束进程或是中止程序
在 Linux 中有几种使用命令行或图形界面终止一个程序的方式。进程出错的时候，您可能会想要中止或是杀掉这个进程。在本文中，我们将探索在命令行和图形界面中终止进程或是应用程序，这里我们使用 gedit 作为样例程序。使用命令行或字符终端界面Ctrl + C在命令行中调用 gedit （如果您没有使用 gedit & 命令）程序的一个问题是 shell 会话被阻塞，没法释放命令行提示符。在这种情况下，Ctrl + C （Ctrl 和 C 的组合键） 会很管用。这会终止 gedit ，并且所有的工作都将丢失（除非文件已经被保存）。Ctrl + C 会给 gedit 发送了 SIGINT 信号。这是一个默认终止进程的停止信号，它将指示 shell 停止 gedit 的运行，并返回到主函数的循环中，您将返回到提示符。$ gedit ^C Ctrl + Z它被称为挂起字符。它会发送 SIGTSTP 信号给进程。它也是一个停止信号，但是默认行为不是杀死进程，而是挂起进程。下面的命令将会停止（杀死/中断） gedit 的运行，并返回到 shell 提示符。$ gedit ^Z [1]+ Stopped gedit $ 一旦进程被挂起（以 gedit 为例），将不能在 gedit 中写入或做任何事情。而在后台，该进程变成了一个作业，可以使用 jobs 命令验证。$ jobs [1]+ Stopped gedit jobs 允许您在单个 shell 会话中控制多个进程。您可以终止，恢复作业，或是根据需要将作业移动到前台或是后台。让我们在后台恢复 gedit，释放提示符以运行其它命令。您可以通过 bg 命令来做到，后跟作业 ID（注意上面的 jobs 命令显示出来的 [1]，这就是作业 ID）。$ bg 1 [1]+ gedit & 这和直接使用 gedit & 启动程序效果差不多：$ gedit & 使用 killkill 命令提供信号的精确控制，允许您通过指定信号名或是信号数字为进程发送信号，后跟进程 ID 或是 PID。我喜欢 kill 命令的一点是它也能够根据作业 ID 控制进程。让我们使用 gedit & 命令在后台开启 gedit 服务。假设通过 jobs 命令我得到了一个 gedit 的作业 ID，让我们为 gedit 发送 SIGINT 信号：$ kill -s SIGINT %1 作业 ID 需要使用 % 前缀，不然 kill 会将其视作 PID。不明确指定信号，kill 仍然可以工作。此时，默认会发送能中断进程的 SIGTERM 信号。执行 kill -l 可以查看信号名列表，使用 man kill 命令阅读手册。使用 killall如果您不想使用特定的工作 ID 或者 PID，killall 允许您使用特定的进程名。中断 gedit 最简单的 killall 使用方式是：$ killall gedit 它将终止所有名为 gedit 的进程。和 kill 相似，默认发送的信号是 SIGTERM。使用 -I 选项忽略进程名的大小写。$ gedit & [1] 14852 $ killall -I GEDIT [1]+ Terminated gedit 查看手册学习更多 killall 命令选项（如 -u）。使用 xkill您是否遇见过播放器崩溃，比如 VLC 灰屏或挂起？现在你可以像上面一样获得进程的 PID 来杀掉它，或者使用 xkill 命令终止应用程序。xkill 允许您使用鼠标关闭窗口。仅需在终端执行 xkill 命令，它将会改变鼠标光标为一个 X 或是一个小骷髅图标。在你想关闭的进程窗口上点击 x。小心使用 xkill，如手册描述的一致，它很危险。我已经提醒过您了！参阅手册，了解上述命令更多信息。您还可以接续探索 pkill 和 pgrep 命令。via: https://opensource.com/article/18/5/how-kill-process-stop-program-linux作者：Sachin Patil 选题：lujun9972 译者：CYLeft 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Linux 的命令行里面有用来停止正在运行的进程的所有所需工具。Jack Wallen 将为您讲述细节。想像一下：你打开了一个程序（可能来自于你的桌面菜单或者命令行），然后开始使用这个程序，没想到程序会锁死、停止运行、或者意外死机。你尝试再次运行该程序，但是它反馈说原来的进程没有完全关闭。你该怎么办？你要结束进程。但该如何做？不管你信与不信，最好的解决方法大都在命令行里。值得庆幸的是， 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 NameSingle ValueEffectSIGHUP1挂起SIGINT2键盘的中断信号SIGKILL9发出杀死信号SIGTERM15发出终止信号SIGSTOP17, 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命令是一个好的方法。via: https://www.linux.com/learn/intro-to-linux/2017/5/how-kill-process-command-line作者：JACK WALLEN 译者：hwlog 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Linux的命令行提供很多命令来杀死进程。比如，你可以向“kill”命传递一个PID来杀死进程；“pkill”命令使用一个正则表达式作为输入，所以和该模式匹配的进程都被杀死。但是还有一个命令叫“killall”，默认情况下，它精确地匹配参数名，然后杀死匹配进程。在这篇文章中，我们将讨论有关这个命令的实际应用。Linux 的 killall 命令killall命令可以用来给一个特定的进程发送一个信号。这个信号默认情况下是SIGTERM，但也可以由killall命令使用参数来指定其它信号。现在让我们通过一些实际的例子来看看这个命令的实际用法。1. 基本示例在这个例子中，我们将使用killall来杀死特定进程。假如，有两个开头字符相同的进程：$ ps -aef | grep “test” himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test himanshu 3970 2811 0 14:14 pts/0 00:00:00 ./test_again 如何杀死“test\_again”进程呢？$ killall test_again [2]+ Terminated ./test_again 如你所见，killall命令终止了“test\_again”进程。你可以通过ps命令来确认这个事实：$ ps -aef | grep “test” himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test 你可以观察到“test\_again”没有被显示出来，因为它已经被杀死了。2. 使用 -I 选项忽略大小写默认情况下，killall命令是大小写敏感的。例如：$ ps -aef | grep “test” himanshu 4177 3161 0 14:54 pts/3 00:00:00 ./test himanshu 4178 3161 0 14:54 pts/3 00:00:00 ./test_again himanshu 4180 3161 0 14:54 pts/3 00:00:00 grep --color=auto test $ killall TEST TEST: no process found 你可以看到，killall命令找不到叫做“TEST”的进程，但是“test”进程是确确实实的在运行的。来让killall命令忽略大小写，可以使用-I选项（大写i）。例如：$ killall -I TEST [1]- Terminated ./test 你可以观察到，现在你成功的终止了“test”进程。3. 使用 -i 选项交互式的终止进程killall命令可以用来终止多个进程。$ killall test test_again [2]- Terminated ./test_again [3]+ Terminated ./test 但是，如果你想要killall交互式地来终止进程，你可以使用-i选项。这里是例子：$ killall -i test test_again Kill test(4201) ? (y/N) y Kill test_again(4202) ? (y/N) y [1]- Terminated ./test [2]+ Terminated ./test_again 你可以看到，用这种方式，在同时终止多个进程时，用户可以控制是否终止某一个进程。4. 使用 -q 选项关闭命令执行回显有些时候，当killall找不到指定的进程时，它就会像下面这样输出错误信息。$ killall TEST TEST: no process found 但是，当你想要killall执行地安安静静的话，你就可以使用-q选项：$ killall -q TEST $ 如你所见，-q选项被使用之后，killall命令的输出信息就被抑制了。5. 使用-l选项列出所有支持的信号（signal)如之前描述的一样，killall向进程发送信号。你可以使用-s选项（后面跟一个信号名）来向一个进程发送特殊信号。想要知道所有可以发送的信号，可以使用-l选项（小写L）来获取：$ killall -l HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS UNUSED killall支持上面的所有信号。看着这些信号的名字，可能你心里就会嘀咕：这些信号都是干什么的？译者注：使用下面的命令来获取所有信号的说明：$ man 7 signal我需要和大家讨论一件事情killall命令的man说：假如进程的名字的长度小于等于15，默认情况下就会以完整名称匹配。比如，假设有两个名字很长的进程：$ ps -aef | grep “test” himanshu 4021 3161 0 14:27 pts/3 00:00:00 ./test_abcdefghij himanshu 4035 3161 0 14:27 pts/3 00:00:00 ./test_abcdefgh 第一个进程的名字有15个字符。现在，让我们试着使用killall杀死这个进程：$ killall test_abcdefghij [1]- Terminated ./test_abcdefghij 如你所见，killall命令成功杀死了这个进程。假如，两个进程的名字都超过15个字符，根据man，killall将把两个进程全部杀死。比如：$ ps -aef | grep “test” himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx himanshu 4141 3161 0 14:46 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwxyz himanshu 4143 3161 0 14:46 pts/3 00:00:00 grep --color=auto test 你可以观察到，两个进程的名字都超过15个字符。现在，当我使用killall试着杀死第二个进程时：$ killall test_abcdefghijklmnopqrstuvwxyz [6]+ Terminated ./test_abcdefghijklmnopqrstuvwxyz 它只杀死了指定的进程，另一个则没有被杀死。$ ps -aef | grep “test” himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx himanshu 4146 3161 0 14:47 pts/3 00:00:00 grep --color=auto test 我不太确定，是我进行的尝试中有不对的地方，还是这是killall的一个bug。假如你在评论中写上你的观点，我会非常感激。顺便说一下，这是我机器上killall命令的版本信息：$ killall --version killall (PSmisc) 22.20 Copyright (C) 1993-2012 Werner Almesberger and Craig Small PSmisc comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under the terms of the GNU General Public License. For more information about these matters, see the files named COPYING. via: http://linoxide.com/linux-command/linux-killall-my-options/译者：intermerlin 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出