如何在退出前处理程序中杀死 bash 脚本的所有后台进程和衍生进程?

如何在退出前处理程序中杀死 bash 脚本的所有后台进程和衍生进程?

我正在使用该wait -n技术来执行max_jobs并行任务:

#!/usr/bin/env bash

cleanup() {
    echo "cleaning up..."
}

trap "cleanup" EXIT

do_task() {
    echo "doing task" "$1"  " ..."
    sleep 3s
}

main_task() {
    for ((j = 0; j < 10; j++)); do
        ((i++ < max_jobs)) || wait -n
        do_task "$j" &
    done
    wait
}

i=0
max_jobs=4

main_task

cleanup如果我点击,如何杀死此脚本(在处理程序中)生成的所有作业和进程Ctrl+C

我尝试kill 0cleanup,但它似乎并没有杀死悬而未决的do_task工作。

请注意,如果我在前 3 秒内发送SIGTERM( Ctrl+C),则会终止脚本。但如果我等到 5 秒然后发送SIGTERM,突然一个悬空进程消耗了 100% 的 CPU,就好像它陷入了无限循环。我必须关注该流程htopSIGKILL手动发送给它。

答案1

建议:改用 GNU Parallel。

parallel --embed > myscript.sh

将此附加到myscript.sh

env_parallel --session
do_task() {
    echo "doing task" "$1"  " ..."
    sleep 3s
}
seq 40 | env_parallel -j4 do_task

CTRLC现在将杀死所有do_tasks。

相关内容