【Linux】如何在Linux中杀死所有停止的进程

496 阅读3分钟

iconmonstr-github-1.svg

介绍

终止已停止的作业或进程并不难。通常,我们只需要使用进程ID调用kill命令。但是,有时Linux可能会隐藏进程,这取决于启动它们的终端以及它们是否具有更高的权限。

在本文中,我们将讨论如何使用多个命令在不同场景中定位和终止这些进程。

在同一终端杀死所有停止的进程

杀死从同一终端启动的已停止进程相当容易。我们需要做的就是找到进程ID,然后向它们发送SIGKILL信号。

例如,我们可以使用sleep命令来启动一个什么都不做的任务:

sleep 1m

该程序将占用终端1分钟。运行上述命令后,我们使用CTRL+Z中断它以发送SIGTSTP信号:

Screenshot from 2022-08-21 21-52-47.png 现在,我们有一个停止的进程。接下来,我们可以使用jobs命令列出该进程:

jobs -p -s

在这里,我们使用-p来获取进程ID,而-s只过滤已停止的进程。

此外,我们可以使用-l参数而不是-p来更详细地查看已停止的进程:

jobs -ls

jobs -ls命令将显示在此会话中启动的所有已停止进程。一旦我们找到它们的进程ID,我们可以使用kill命令通过向kill命令提供多个进程ID来停止所有它们,或者我们可以直接在kill命令之后通过管道传递命令,如下所示:

kill -9 `jobs -ps`

重要的是,最好使用SIGKILL,而不是SIGTERM信号,因为高级语言的代码(Go,Java等)很容易捕获或阻止后者。

从另一个终端杀死所有停止的进程

有时我们无法直接访问运行特定作业的终端。在这些情况下,有一种机制来识别和停止此类进程是很方便的。

Linux不允许我们使用jobs命令从另一个终端查看终端启动的进程。因此,我们将使用ps命令。

让我们首先创建前面描述的流程的两个实例:

Screenshot from 2022-08-21 22-13-13.png

注意使用tty来显示我们正在使用的终端。此外,我们使用bg来确保只有第一个进程停止,而最后一个进程在后台运行。

我们可以在另一个终端中使用ps命令来查看新创建的进程。事实上,标志aux确保我们看到当前用户(u)下的所有进程(a)及其状态(x):

Screenshot from 2022-08-21 22-14-24.png 当然,我们可以使用grep来按进程名进行过滤。此外,为了识别正确的进程,我们需要注意STAT列,它保存了进程的当前状态。至关重要的是,T代表“由作业控制信号停止”,这意味着它是终端的已停止进程。

上面的输出显示我们已经停止了进程414461,而进程414475仍在运行。 现在,我们使用awk过滤:

ps aux | awk {'if ($8 == "T") print $2" "$8" "$11'}

Screenshot from 2022-08-21 22-25-11.png 上面,我们只使用输出行,其中第8列(8STAT)的值为T。从这些行中,我们提取进程IDSTAT以及通过8,STAT)的值为T。从这些行中,我们提取进程ID、STAT以及通过`2" "8""8" "11运行的实际命令。这个awk`表达式会将所有停止的进程显示为一个列表。

最后,我们可以通过将ps的输出传递给kill来杀死所有停止的进程:

kill -9 `ps aux | awk {'if ($8 == "T") print $2'}`

我们可以验证正确的进程已在原始终端中被杀死。

结论

在本文中,我们简要介绍了如何在不同情况下杀死所有停止的进程。首先,我们使用jobs命令来识别本地终端进程。之后,我们使用ps来帮助处理特定情况。