スクリプトを書いていますが、それを行う方法が見つからないために必要なものがあります…
バックグラウンドでコマンドを作成する必要があります “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プロセス番号を指定しましたが、それも機能しませんでした。
コメント
回答
コマンド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
command1
? 4つのプロセスのPIDを返すように変更できますか?$!
変数を使用してこれを取得し、ここで示したようにwait
コマンドに渡すことができます。$!
には最後のバックグラウンドPIDが含まれ、$$
には最後に実行されたプロセスが含まれます' s PID 。