シェルスクリプトがバックグラウンドコマンドを待つ

スクリプトを書いていますが、それを行う方法が見つからないために必要なものがあります…

バックグラウンドでコマンドを作成する必要があります “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  

waitコマンドでpidプロセス番号を指定しましたが、それも機能しませんでした。

コメント

  • 制御しますかcommand1? 4つのプロセスのPIDを返すように変更できますか?
  • はい!私はすでにそれを持っています:)
  • それに応じて答えを更新しました。期待に一致するかどうか教えてください。
  • このQは次のQに関連しています: unix.stackexchange.com/questions/100801/ … 。唯一の違いは、バックグラウンドプロセスからPIDを取得する必要があることです。 $!変数を使用してこれを取得し、ここで示したようにwaitコマンドに渡すことができます。 $!には最後のバックグラウンドPIDが含まれ、$$には最後に実行されたプロセスが含まれます' s PID 。
  • OK、スクリプトはまったく意味がありません。構文エラーと奇妙さがいたるところにあります。 実際のスクリプトを見せていただけますか?なぜコマンドを調達するのですか?それらを実行しないのはなぜですか?

回答

コマンドwait PIDプロセスが終了するのを待ちます。

$!

Inを使用して最後のコマンドの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 

コメント

  • 作成されたPID(xxxxx、yyyyy、xxyyy、yyxxx)がわかっている場合は、編集後)、待機するPIDのリストとともにwaitを使用することもできます(manを参照)。 'それらを知らない場合は、それらをcommand1に集めることができます(command1とは何ですか?独自のスクリプトですか?)
  • おそらくそれらを確実にするのが最善です'最初は正しくグループ化されています。それがどのように行われるかについては、私の答えを参照してください。

回答

これを行う最もクリーンな方法comamnd1が起動されたプロセスのPIDを返し、@ LaurentCのよって提案されているように各プロセスでwaitを使用するようにします。 div id = “9fde441b07″>

回答。

別のアプローチは次のようになります:

## 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 

コメント

  • 申し訳ありませんが、まだ機能していません。もう一度質問を改善します!

回答

次の方法を使用する場合、whileループの後に特別な「すべてのプロセスを待機」する必要がない場合があります。ループは現在のは、トップに戻る前に完了します。アドバイスと同様に注意してください。私が行ったのは、& wait $!& wait $!の最後に追加することだけでした。 div id = “c511827217″>

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です