如何杀死从另一个 shell 实例在一个子 shell 中通过 bg 提交的作业?

如何杀死从另一个 shell 实例在一个子 shell 中通过 bg 提交的作业?

假设,作为一个虚拟示例,我在一个终端选项卡中执行 bash 命令:

$: sleep 1000 &

然后,在另一个选项卡中,我运行应该“杀死所有后台作业”的命令:

$: jobs -p | xargs -a kill

除非什么也没有发生。或者,更好的是:如何列出我的用户通过<some-job> &任何上下文启动的所有作业?

答案1

jobs命令是 shell 内置命令,因此仅适用于当前 shell 实例化。特别是,Bash 手册描述jobs为:

-p 仅列出进程 ID作业流程组组长的

(强调我的。)

如果您运行jobs -l,您将看到您在另一个 shell 中后台运行的 sleep 也没有列出。

列出命令全部流程是ps.它的参数语法可能有点巴洛克式,所以你最好man ps自己检查一下。对于我自己来说,我通常使用其中之一:

ps aux
ps axjf

一个仅给出所有进程的列表,另一个以依赖树格式排列它们。您也可以尝试pgrep作为查找与名称匹配的特定进程的方法。

附带说明一下,如果您在存在安全问题的环境中操作,请注意,有一些偷偷摸摸的方法甚至可以对 root 用户隐藏进程,例如,请参阅https://github.com/gianlucaborello/libprocesshider

相关内容