バックグラウンドでバックグラウンドタスクを待つ方法は?

バックグラウンドでバックグラウンドタスクを待つ方法は?

次の質問があります。

$ 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印刷物の価値)。

関連情報