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
あります-P
xargs
答え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 ...}