如何从Linux终端中终止进程
有时杀死进程是摆脱它的唯一方法。尽管名称苛刻,但是杀死进程只是意味着迫使它退出。这是从Linux或者macOS命令行执行操作的方法。
什么是进程?
运行诸如Web浏览器之类的程序,与桌面环境相关联的后台进程以及Linux系统服务都是这些进程。
我们可以将进程分为两组:
前台进程是由用户启动或者启动的进程。它们可能在终端窗口中,或者可能是图形应用程序。
后台进程是所有自动启动且与用户没有任何交互的进程。他们不期望来自用户的输入,也不向他们展示结果或者输出。后台进程是诸如服务和守护程序之类的东西。
如果前台流程是剧院工作人员和演员的前台,则后台流程是幕后团队的后台。
当进程行为异常或者出现故障时,它们可能会占用过多的CPU时间,消耗RAM或者进入紧密的计算循环而变得无响应。图形应用程序可以拒绝响应鼠标单击。终端应用程序可能永远不会使我们返回命令提示符。
终止进程只是意味着迫使该进程退出。如果该过程拒绝响应,则可能有必要。
Linux提供了kill
,pkill
和killall
命令,使我们能够做到这一点。这些命令可用于任何类型的进程,图形或者命令行,前台或者后台。
杀死命令
要使用kill
,我们必须知道要终止的进程的进程ID(PID)。 ps命令可用于查找进程的PID。
要使ps搜索所有进程,请使用-e(所有进程)选项。建议通过less
进行输出,其中会有很多。键入" ps",一个空格,"-e",一个空格," |"(管道字符),另一个空格,然后键入" less"。按Enter执行命令。
ps -e | less
这将为我们提供一个与以下屏幕截图类似的流程列表。我们可以使用/
键在less
中向前搜索,也可以使用?
键向后搜索。
为了找到我们感兴趣的进程,请通过管道将ps的输出通过grep传递,并指定进程名称或者名称。
ps -e | grep shutter
找到要终止的进程的PID之后,将其作为参数传递给kill
命令。要终止上一条命令标识的"快门"过程,请使用以下命令:
kill 2099
" kill"命令是一个无声的刺客,如果成功,它不会给我们任何反馈。
pkill命令
使用pkill命令可以按名称杀死处理器进程。我们无需通过PID识别过程。要使用" pkill",我们需要提供一个搜索词," pkill"使用该搜索词来检查正在运行的进程列表。匹配过程终止。因此,我们需要确定自己的搜索词拼写正确。
作为安全网,可以在使用pkill命令之前使用pgrep命令。 pgrep命令也接受一个搜索词。它将列出与搜索词匹配的每个进程的PID。这是安全的,因为pgrep不会向进程发出任何终止信号,并且如果我们键入错误的搜索词也不会错误地终止另一个进程。我们可以先确定搜索词的正确含义,然后再将其传递给pkill
。 pkill
和pgrep
都以相同的方式处理搜索项。他们的处理是如此相似,以至于他们共享相同的手册页。
假设有一个名称为subq的进程。我们将使用ps -u dave | grep
命令来窥视幕后。我们可以看到subq将与该进程匹配,并且仅与该进程匹配,这是为了看到该进程的全名。
ps -u dave | grep subq
假设我们的用户还没有这样做;他们所知道的只是进程名称包含子字符串subq。他们使用pgrep来检查搜索词是否只有一个匹配项。然后,他们将搜索词与pkill
一起使用。
pgrep subq
pkill subq
我们可以使用pkill
一次杀死多个进程。用户在此处运行" pgrep"来检查Chrome启动了多少个进程。他们使用pkill
杀死了所有人。然后,他们用pgrep检查它们是否都被删除了。
pgrep chrome
pkill chrome
pgrep chrome
如果有多个同名进程正在运行,但是我们不想杀死所有进程,则可以将pgrep与-f选项(命令行)一起使用,以识别哪个进程。一个简单的例子是两个" ping"过程。我们想杀死其中一个而不是另一个。我们可以使用它们的命令行来区分它们。请注意使用引号来包装命令行参数。
pgrep -f "ping 192.168.4.22"
pkill -f "ping 192.168.4.22"
killall命令
警告:在Solaris和OpenIndiana操作系统中," killall"命令将杀死属于所有进程。如果是root或者发出了sudo killall,我们将重新启动计算机!在本文的研究过程中,此行为已通过最新版本的OpenIndiana Hipster 2016.10确认。
" killall"命令的操作方式与" pkill"命令的操作方式类似,但有特定的区别。我们必须提供确切的进程名称,而不是将搜索项传递给命令。
我们不能提供与流程名称的部分匹配;我们必须提供完整的流程名称,如下所示:
killall shutt
killall shutter
-y(小于)选项使我们可以终止运行少于指定时间的进程。期间以数字给出,后跟以下单位之一:
s(秒)
米(分钟)
小时(小时)
d(天)
w(周)
M(月,注,大写M)
y(年)
要杀死刚刚启动的名为" ana"的进程并让任何" ana"实例运行,请在两分钟内作出反应,将以下参数与" killall"一起使用:
killall -y 2m ana
-o(早于)选项允许我们终止运行时间超过指定时间的进程。这个命令将杀死所有已经运行超过一天的ssh
连接:
killall -o 1d sshd