シェルスクリプトでnohup操作が完了するのを待つ方法は?

シェルスクリプトでnohup操作が完了するのを待つ方法は?

次のスクリプトがあります。

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_fileman flockEasy Shellアクセス可能ファイルのロックを参照してください。

関連情報