シェルスクリプトはバックグラウンドコマンドを待ちます。

シェルスクリプトはバックグラウンドコマンドを待ちます。

スクリプトを書いていますが、何かが必要ですが、方法が見つかりません...

バックグラウンド「command1&」からコマンドを生成し、コマンド2を実行する前に、スクリプトのどこかでコマンドが完了するまで待つ必要があります。デフォルトでは、以下が必要です。

注:各コマンドは特定のディレクトリで実行されます! whileループが終わると、私のcommand1はそれぞれ特定のプロセスを実行する4つのディレクトリを作成するため、実行されるプロセスの総数は4つです。

a=1

while [$a -lt 4 ]

     . command1
   #Generates 1 Process  

     a= `export $a +1`
done

   #Wait until the 4 process end and then run the command2 

    . command2

pidプロセス番号を含むコマンドの内容を見たことがありますが、waitそれも機能しません。

答え1

wait PIDこのコマンドを使用して、プロセスが終了するのを待つことができます。

次のコマンドを使用して、最後のコマンドのPIDを取得することもできます。$!

あなたの場合は、次のように動作します。

command1 & #run command1 in background
PID=$! #catch the last PID, here from command1
command2 #run command2 while command1 is running in background
wait $PID #wait for command1, in background, to end
command3 #execute once command1 ended

編集後は複数のPIDがあり、それを知っているので、次のことができます。

command1 & #run command1 in background
PID1=xxxxx
PID2=yyyyy
PID3=xxyyy
PID4=yyxxx
command2 #run command2 while command1 is running in background
wait $PID1 $PID2 $PID3 $PID4 #wait for the four processes of command1, in background, to end
command3 #execute once command1 ended

答え2

最もクリーンな方法は、comamnd1開始されたプロセスのPIDを返し、wait@LaurentCが提案したように各プロセスで使用することです。回答

別の方法は次のとおりです。

## Create a log file
logfile=$(mktemp)

## Run your command and have it print into the log file
## when it's finsihed.
command1 && echo 1 > $logfile &

## Wait for it. The [ ! -s $logfile ] is true while the file is 
## empty. The -s means "check that the file is NOT empty" so ! -s
## means the opposite, check that the file IS empty. So, since
## the command above will print into the file as soon as it's finished
## this loop will run as long as  the previous command si runnning.
while [ ! -s $logfile ]; do sleep 1; done

## continue
command2

答え3

次のアプローチを使用する場合は、whileループの後に特別な「すべてのプロセスを待機」する必要はありません。ループは、現在のループがcommand1完了するのを待ってから、再びトップに戻ります。どんなアドバイスでも慎重に取り扱ってください。私がした唯一のことは& wait $!あなたのcommand1

a=1
while [$a -lt 4 ]
     . command1  & wait $!
   #Generates 1 Process  
     a= `export $a +1`
done

関連情報