如何从Linux终端中终止进程

时间:2020-01-09 10:39:29  来源:igfitidea点击:

有时杀死进程是摆脱它的唯一方法。尽管名称苛刻,但是杀死进程只是意味着迫使它退出。这是从Linux或者macOS命令行执行操作的方法。

什么是进程?

运行诸如Web浏览器之类的程序,与桌面环境相关联的后台进程以及Linux系统服务都是这些进程。

我们可以将进程分为两组:

  • 前台进程是由用户启动或者启动的进程。它们可能在终端窗口中,或者可能是图形应用程序。

  • 后台进程是所有自动启动且与用户没有任何交互的进程。他们不期望来自用户的输入,也不向他们展示结果或者输出。后台进程是诸如服务和守护程序之类的东西。

如果前台流程是剧院工作人员和演员的前台,则后台流程是幕后团队的后台。

当进程行为异常或者出现故障时,它们可能会占用过多的CPU时间,消耗RAM或者进入紧密的计算循环而变得无响应。图形应用程序可以拒绝响应鼠标单击。终端应用程序可能永远不会使我们返回命令提示符。

终止进程只是意味着迫使该进程退出。如果该过程拒绝响应,则可能有必要。

Linux提供了killpkillkillall命令,使我们能够做到这一点。这些命令可用于任何类型的进程,图形或者命令行,前台或者后台。

杀死命令

要使用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不会向进程发出任何终止信号,并且如果我们键入错误的搜索词也不会错误地终止另一个进程。我们可以先确定搜索词的正确含义,然后再将其传递给pkillpkillpgrep都以相同的方式处理搜索项。他们的处理是如此相似,以至于他们共享相同的手册页。

假设有一个名称为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