私はスクリプトを書いていますが、それを行う方法が見つからないために必要なものがあります...
コマンドをバックグラウンドで「command1&」にしてから、スクリプトのどこかで、command2を実行する前にコマンドが完了するのを待つ必要があります。基本的に、私はこれが必要です:
注:各コマンドは特定のディレクトリで実行されます! 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
コマンドについて何かを見たことがありますが、それでもうまくいきませんでした。
コマンド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
これを行う最もクリーンな方法は、comamnd1
起動されたプロセスのPIDを返し、@ LaurentCの answer で提案されているように、各プロセスでwait
を使用します。
別のアプローチは次のようなものです:
## 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ループの後に特別な「すべてのプロセスを待機」する必要がない場合があります。ループは現在のcommand1
循環して上に戻る前に完了します。アドバイスと同じように注意してください。注意、私がしたことは& wait $!
の最後までcommand1
。
a=1
while [$a -lt 4 ]
. command1 & wait $!
#Generates 1 Process
a= `export $a +1`
done