次の質問があります。
$ some_command & # Adds a new job as a background process
$ wait && echo Foo # Blocks until some_command is finished
$ wait && echo Foo & # Is started as a background job and is done immediately
私がやりたいことはwait &
バックグラウンドで待つことです。その他すべてのバックグラウンドタスク完成した。
これを達成する方法はありますか?
答え1
ある時点では、コマンドが実行されるのを待つ必要があります。
ただし、いくつかの機能にコマンドを配置できる場合は、必要なタスクを実行するようにスケジュールできます。
some_command(){
sleep 3
echo "I am done $SECONDS"
}
other_commands(){
# A list of all the other commands that need to be executed
sleep 5
echo "I have finished my tasks $SECONDS"
}
some_command & # First command as background job.
SECONDS=0 # Count from here the seconds.
bg_pid=$! # store the background job pid.
echo "one $!" # Print that number.
other_commands & # Start other commands immediately.
wait $bg_pid && echo "Foo $SECONDS" # Waits for some_command to finish.
wait # Wait for all other background jobs.
echo "end of it all $SECONDS" # all background jobs have ended.
スリープ時間がコード 3 および 5 に示されている場合、some_command は残りのジョブの前に終了し、実行時に印刷されます。
one 760
I am done 3
Foo 3
I have finished my tasks 5
end of it all 5
たとえば、睡眠時間が8と5の場合、以下が印刷されます。
one 766
I have finished my tasks 5
I am done 8
Foo 8
end of it all 8
順序に注意してください。実際、すべてのセクションはできるだけ近いです($SECONDS
印刷物の価値)。