杀死所有后台作业

杀死所有后台作业

是否有比以下更紧凑的杀死后台作业的形式:

for i in {1..5}; do kill %$i; done

另外,{1..5} 显然有一个硬编码的幻数,我怎样才能使它成为“N”,其中 N 是正确的数字,而不执行以下操作:

$(jobs | wc -l)

我实际上在 PS1 中使用 \j 来获取托管作业的数量,这等效吗?

答案1

对于kill由 管理的所有后台作业bash,执行

kill $(jobs -p)

请注意,由于 和 都内置于 中,因此jobskillbash应该遇到任何错误参数列表太长类型。

答案2

使用xargs而不是$(jobs -p)子命令,因为如果jobs -p为空则kill命令将失败。

jobs -p | xargs kill

答案3

我想根据输出的不同jobs -p,解决方案可能会略有不同。就我而言

$ jobs -p
[1]  - 96029 running    some job
[2]  + 96111 running    some other job

因此,这样做是没有好处的。

$ jobs -p | xargs kill
kill: illegal process id: [1]

另一方面,运行kill $(jobs -p)确实有效,但会带来很多错误消息,因为非 PID 字符串也会被传递到kill

因此,我的解决方案是grep先获取PID再使用xargs,如下:

$ jobs -p | grep -o -E '\s\d+\s' | xargs kill

答案4

我更喜欢在杀死它们之前检查是否存在任何作业 - 这样,如果没有任何运行,脚本就不会失败。

打字也更短。把这个扔进你的.bash_profile

function killjobs () {
    JOBS="$(jobs -p)";
    if [ -n "${JOBS}" ]; then;
        kill -KILL ${JOBS};
    fi
}

然后运行:

killjobs

杀死任何正在运行的作业。

相关内容