介绍
终止已停止的作业或进程并不难。通常,我们只需要使用进程ID调用kill
命令。但是,有时Linux可能会隐藏进程,这取决于启动它们的终端以及它们是否具有更高的权限。
在本文中,我们将讨论如何使用多个命令在不同场景中定位和终止这些进程。
在同一终端杀死所有停止的进程
杀死从同一终端启动的已停止进程相当容易。我们需要做的就是找到进程ID,然后向它们发送SIGKILL信号。
例如,我们可以使用sleep
命令来启动一个什么都不做的任务:
sleep 1m
该程序将占用终端1分钟。运行上述命令后,我们使用CTRL+Z中断它以发送SIGTSTP信号:
现在,我们有一个停止的进程。接下来,我们可以使用
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
命令。
让我们首先创建前面描述的流程的两个实例:
注意使用tty
来显示我们正在使用的终端。此外,我们使用bg
来确保只有第一个进程停止,而最后一个进程在后台运行。
我们可以在另一个终端中使用ps
命令来查看新创建的进程。事实上,标志aux
确保我们看到当前用户(u)下的所有进程(a)及其状态(x):
当然,我们可以使用
grep
来按进程名进行过滤。此外,为了识别正确的进程,我们需要注意STAT列,它保存了进程的当前状态。至关重要的是,T代表“由作业控制信号停止”,这意味着它是终端的已停止进程。
上面的输出显示我们已经停止了进程414461,而进程414475仍在运行。 现在,我们使用awk
过滤:
ps aux | awk {'if ($8 == "T") print $2" "$8" "$11'}
上面,我们只使用输出行,其中第8列(2" "11
运行的实际命令。这个
awk`表达式会将所有停止的进程显示为一个列表。
最后,我们可以通过将ps
的输出传递给kill
来杀死所有停止的进程:
kill -9 `ps aux | awk {'if ($8 == "T") print $2'}`
我们可以验证正确的进程已在原始终端中被杀死。
结论
在本文中,我们简要介绍了如何在不同情况下杀死所有停止的进程。首先,我们使用jobs
命令来识别本地终端进程。之后,我们使用ps
来帮助处理特定情况。