Como posso esperar por trabalhos em segundo plano em segundo plano?

2

Eu tenho o seguinte problema:

$ 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

O que eu gostaria que o wait & fizesse é esperar em segundo plano até que todos os outros trabalhos em segundo plano tenham terminado.

De alguma forma eu posso conseguir isso?

    
por Georg 15.11.2016 / 18:28

1 resposta

2

Em algum momento, algo precisa esperar pela execução de comandos.
No entanto, se você pudesse colocar seus comandos dentro de algumas funções, você pode agendá-los para fazer o que você precisa:

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.

Se os tempos de espera forem os mostrados no código 3 e 5, some_command terminará antes do restante dos trabalhos e isso será impresso na execução:

one 760
I am done 3
Foo 3
I have finished my tasks 5
end of it all 5

Se os tempos de sono forem (por exemplo) 8 e 5, isso será impresso:

one 766
I have finished my tasks 5
I am done 8
Foo 8
end of it all 8

Anote o pedido. Além disso, o fato de cada parte ter terminado assim que era possível (o valor de $SECONDS impresso).

    
por 17.11.2016 / 03:33