次のスクリプトがあります。
echo "$wk" | while read -r a b;
do
counter=$(($counter+1))
nohup sh -c 'impala-shell -d nielsen -f query.sql --var=dt=$a --var=incre=$b;
echo $a,$?>>$week_status_file;
if [ $? -ne 0 ]; then
echo $a,$b>>$err_week_file
fi'
if [ $(($counter%5)) == 0 -a $counter -ge 5 ];
then
echo "Check"
wait
fi
done
impala-shell...
アイデアは、2つの変数a
と(変数内)を使用してb
ラップされたコマンドを開始することですwk
。これは5つのプロセスと並行して行われるべきです。次の5つのタスクは、最初の5つのプロセスが完了するのを待つ必要があります。私の現在のコードはそれを印刷しCheck
ますが、まったく待っていません。ただし、wait
に変更するとsleep 10s
スリープ状態になります。
ここでどのようにwait
働きますか?
答え1
プロセス識別子(PID)を提供する必要がありますwait
。また、説明によれば、コマンドがブロックされているように聞こえないため、最終的に待ちたいPIDを収集することがより困難になります。たとえば、プロセスが分岐していて、新しい分岐プロセスのPIDがわからない場合でも、スクリプトの作成を続行できる場合です。
ただしnohup sh -c ...
、回線がブロックされている場合は、バックグラウンドで送信を使用し、バックグラウンド&
プロセスのPIDを保存してから、最後に保存したすべてのPIDを待ちます(例$WAIT_FOR_PIDS
:)。この変数は、$!
実行のためにバックグラウンドで送信された最後のプロセスのPIDを提供します。
WAIT_FOR_PIDS="";
echo "$wk" | while read -r a b;
do
counter=$(($counter+1))
nohup sh -c 'impala-shell -d nielsen -f query.sql --var=dt=$a --var=incre=$b;
echo $a,$?>>$week_status_file;
if [ $? -ne 0 ]; then
echo $a,$b>>$err_week_file
fi' & WAIT_FOR_PIDS="$WAIT_FOR_PIDS $!"
if [ $(($counter%5)) == 0 -a $counter -ge 5 ];
then
echo "Check"
wait $WAIT_FOR_PIDS
WAIT_FOR_PIDS=""
fi
done
また、並列にエコーするときは、競争条件を考慮する必要があります$week_status_file
。man flock
Easy Shellアクセス可能ファイルのロックを参照してください。