私はこの手法を使って並列作業を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
まるで無限ループにかかったかのように突然ぶら下がったプロセスがCPUの100%を消費します。手順に従って手動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
。