Como obter o status de saída de um processo em segundo plano?

1

Estou executando dois mysql sp em um script bash. Eu quero iniciar os dois simultaneamente (eles estão executando em servidores remotos) e colocá-los em segundo plano, uma vez concluído, vá para a próxima etapa. Eu quero pegar o exit status de ambos (para saber se o erro aconteceu). Com isso em mente, tentei abaixo com o comando sleep , mas não estou funcionando.

Editar de acordo com resposta de Jeff Schaller: Abaixo está o que eu tentei .

givinv@87-109:~$ sleep5 & PID5=$!; exit5=$?; sleep 4 & PID4=$!; exit4=$?; wait $PID5 $PID4; echo $exit5 $exit4
[1] 29530
[2] 29531
No command 'sleep5' found, did you mean:
 Command 'sleep' from package 'coreutils' (main)
sleep5: command not found
[1]-  Exit 127                sleep5
[2]+  Done                    sleep 4
0 0
givinv@87-109:~$ unset exit5 exit4
givinv@87-109:~$ sleep5 & exit5=$?;PID5=$!; sleep 4 & exit4=$?;PID4=$!; wait $PID5 $PID4; echo $exit5 $exit4
[1] 29535
[2] 29536
No command 'sleep5' found, did you mean:
 Command 'sleep' from package 'coreutils' (main)
sleep5: command not found
[1]-  Exit 127                sleep5
[2]+  Done                    sleep 4
0 0
givinv@87-109:~$ 

Eu conscientemente coloquei sleep5 (comando de erro), mas ainda obtive 0 como exit status . Quando executo os comandos acima, vejo uma linha como [1]- Exit 127 sleep5 . É possível capturar isso durante a execução do script?

Como obter o exit status de dois comandos que executam simultaneamente ?

    
por prado 30.01.2017 / 12:57

1 resposta

1

De a página man bash , minha ênfase em itálico:

wait

wait [-n] [jobspec or pid …]

Wait until the child process specified by each process ID pid or job specification jobspec exits and return the exit status of the last command waited for.

Acho que você talvez tenha perdido o símbolo de fundo & :

sleep 5 ;exit5=$? & PID5=$!;wait $PID5; echo $?; echo $exit5

Diz para dormir por 5 segundos; uma vez feito isso, defina o código de saída (zero) em exit5 como um processo em segundo plano; defina o ID do trabalho dessa designação em PID5 ; então espere essa tarefa terminar; a atribuição foi concluída com sucesso, então echo mostra que zero; então o último echo mostra uma linha em branco, como o processo em segundo plano (subshell) saiu, deixando a variável exit5 não atribuída (vazia).

Talvez seja essa a situação para a qual você estava indo?

sleep 5 & PID5=$!; wait $PID5; exit5=$?; echo $exit5

Coloque sleep 5 em segundo plano, salvando seu PID em PID5 . Aguarde a saída do processo, capture seu código de retorno em exit5 e, em seguida, faça eco do código de retorno salvo.

    
por 30.01.2017 / 13:00