web-dev-qa-db-ja.com

バックグラウンドでバックグラウンドジョブを待つにはどうすればよいですか?

私は次の問題を抱えています:

$ 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 &することは、他のすべてのバックグラウンドジョブが終了するまでバックグラウンドで待機することです。

私はそれを達成することができますか?

2
Georg

ある時点で、何かがコマンドの実行を待たなければなりません。
ただし、いくつかの関数内にコマンドを配置できる場合は、必要なことを実行するようにコマンドをスケジュールできます。

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の値が出力されます)。

2
Isaac