1つの子プロセスを除くすべてのプロセスの実行が完了するのを待つ方法

1つの子プロセスを除くすべてのプロセスの実行が完了するのを待つ方法

私が書いているスクリプトのバックグラウンドでいくつかのプロセスを始めています。 forループの各反復が終了する前に、これらのプロセスのいくつかが完了するのを待ちたいのですが、独立して実行して終了する必要があるプロセスが1つあります。今私がやっていることは、メモリが不足していて実行中のスクリプトを含む、ますます多くのプロセスを犠牲にしているようです。私が現在持っているものは次のとおりです。

loadAvg &
pid=$!
echo "LA pid $pid"
for (( j=0; j < $units_to_fill; j=$((j+1)) )); do
    #Print all files in dir | shuffle file names | delete 1st 1024 files found
    if [ $from_zero -ne 1 ];then
        stat -c %n * | sort -rz | awk -v n=0 '/file_[0-9]*_[abcd].bin/ { if( ++n <= 1024) {print $1 ; }}' | xargs -r rm -f
    fi
    echo "Creating file $j"
    pids=$(writeFile "file_${j}.bin" $src_file $block_size $block_count "${wd}/${dd_log_file}") #Writes a file of (dd) block size 1MB, with 1024 blocks
    for job in `jobs -p`; do
        if [[ $job -ne $pid ]]; then
            echo "Waiting for $job"             
            wait $job
        fi
    done
done
kill $pid

この関数は多くの子プロセスを生成し、以前writeFileと同様に終了順序を保証することはできません。wait $!

for job in `jobs -p`

関数によって生成された子プロセスのpidをキャプチャすることができ、現在はデフォルトで型として返されますが、一部のプロセスがその行に達する前に完了してエラーが発生するため、pid1 pid2 pid3 ...実行はwait $pids機能しません。wait

注:私はbusybox Linuxがインストールされている組み込みシステムで実行されているので、かなり単純化されており、多くの標準機能は利用できません。

ベストアンサー1

このwaitコマンドには複数の引数を指定でき、すべてのプロセスが終了するのを待ちます。したがって、待ちたいすべてのPIDをループの配列に入れて、次のようにします。

wait ${pids[@]}

サイクル後。

おすすめ記事