我正在使用该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 0
过cleanup
,但它似乎并没有杀死悬而未决的do_task
工作。
请注意,如果我在前 3 秒内发送SIGTERM
( Ctrl+C
),则会终止脚本。但如果我等到 5 秒然后发送SIGTERM
,突然一个悬空进程消耗了 100% 的 CPU,就好像它陷入了无限循环。我必须关注该流程htop
并SIGKILL
手动发送给它。
答案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_task
s。