Bash: executa quando o trabalho em segundo plano é concluído

1

Se você quiser executar uma série de comandos, um após o outro, você pode executar

command1 & command2 & command3 &

Se eu executar command1 , então Ctrl + Z e, em seguida, bg , ele executará command1 no segundo plano.

Minha pergunta é, se eu executar command1 e enviá-lo para o segundo plano, é possível dizer ao bash para esperar que ele seja concluído, então execute command2 e command3 no segundo plano depois que ele terminar? / p>     

por ewok 13.11.2015 / 16:06

2 respostas

1

O comando wait , sem especificações adicionais, irá esperar pelo final de todos os processos-filhos ativos . Isso significa que se houvesse outro processo também, ele aguardaria o fim do último que terminaria.

O Wait pode ser chamado especificando um ID : com o ID é possível passar ou o PID (ID do processo) ou a especificação do trabalho . Além disso, se não fosse um único comando, mas um pipe, wait aguardará o final do pipeline completo (veja abaixo).

Portanto, com wait 7165 , ele aguardará o final do processo com o ID 7165, com wait %2 do trabalho [2] .

Em um script, você pode armazenar o PID do último trabalho enviado usando a variável $! ; você precisa armazenar esse valor porque ele será atualizado após cada execução de comando.

#!/bin/bash
...
command1 &                             # Another command in background  job [1]
command2 && command2b && command2c &   # The command in background      job [2]
PID_CMD1=$!                            # Store the PID of the last job, job [2]

some_other_commands       # ...       

                          # With this command you will 
wait                      # block all until command0 and all  
                          # the pipe of command1 are completed or...

wait $PID_CMD1            # With this command you will wait only the end
                          # of command1 pipeline or...

wait %2                   # With this command you'll wait the end of job [2]    
                          # Note that if the command 1 fails or is really fast 
                          # you can have for the command 2 the job ID 1
command3 &                # job [1] again! it's possible to recycle the numbers
command4 &                # job [2] 

De man bash :

The shell associates a job with each pipeline. It keeps a table of currently executing jobs, which may be listed with the jobs command. When bash starts a job asynchronously (in the background), it prints a line that looks like:
[1] 25647
indicating that this job is job number 1 and that the process ID of the last process in the pipeline associated with this job is 25647. All of the processes in a single pipeline are members of the same job. Bash uses the job abstraction as the basis for job control...

Você pode ler mais sobre como esperar com help wait .

    
por 16.11.2015 / 14:37
2

Supondo que você queira fazer outra coisa depois de iniciar o command1 , mas antes de esperar que ele seja concluído, use o shell embutido wait .

command1 &
some_other_command
wait  # block until command1 completes

command2 &
command3 &
    
por 13.11.2015 / 21:11

Tags