Bashで多くのバックグラウンドタスクを待つ方法

Bashで多くのバックグラウンドタスクを待つ方法

Bashで並列処理を実行するには?

私のbashスクリプトでは、私のアプローチは多くのバックグラウンドタスクを追加し、配列を使用して&各プロセスIDを追加し、ループを使用してその配列を取得し、その中でwaitコマンドを使用することです。しかし、とにかくwait命令は在職中ではありません。

私のコードは次のとおりです

for i in some path 
do 
    ls -d $i | xargs du -kh --max-depth=0 |sed 's/\t/,/g' >> $TEMP/Outfile/disk_usage_Session_wise.csv & 
    pid=$!
    ls -d $i/session | xargs du -kh --max-depth=1 | sed 's/\t/,/g' >> $TEMP/Outfile/disk_usage_Session_wise.csv & 
    pid_1=$! 
    process_list=($pid $pid_1) 
done 

for job in echo ${process_list[@]} 
    do 
    echo "$job is running" 
    wait $job # this command is not working 
done –

答え1

他のソフトウェアを使用できますか?それともbashしかできませんか?GNU Parallelこれが作業を完了するために必要なようです。または少なくとも議論が-nあります-Pxargs

答え2

この改良された行はスクリプトの最初の部分を変更する必要があります。

process_list+=($pid $pid_1) 

これは2部でなければなりません。テストされていないことを参照してください。

for job in ${process_list[@]} 
do 
    ps -ho pid | >/dev/null grep $job && {
        echo "$job is running" 
        wait $job # this command should be ok now         
    }
done
  • ps -ho pid-o pidヘッダー行()なしで実行中のプロセスのリスト()を生成します-h

  • |このリストを()に渡します。grep

  • grep$job( )が見つかったら、コマンド&&ブロックを実行します(){echo ...}

関連情報