事前終了ハンドラで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 0試してみましたが、cleanup保留中のジョブを終了しないようですdo_task

最初の3秒以内にSIGTERM()を送信すると、Ctrl+Cスクリプトは終了します。しかし、5秒待ってから送信すると、SIGTERMまるで無限ループにかかったかのように突然ぶら下がったプロセスがCPUの100%を消費します。手順に従って手動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_task

おすすめ記事