como obter o código de saída do tempo limite enquanto executa um comando em segundo plano?

1

Estou escrevendo um script de shell para executar o comando ping em segundo plano e, ao mesmo tempo, definir um valor de tempo limite para o comando ping, quero obter o código de saída se o ping terminar por tempo limite, eu uso abaixo:

timeout 10s ping -c 5 www.google.com | awk '{print "from local to google |", $0;}' &
exit_status=$?
echo $exit_status

mas descobri que o código de saída retornado é para "&", o comando é executado em segundo plano, não no tempo limite.

como eu poderia obter o código de saída do tempo limite?

    
por Echo 07.06.2017 / 04:59

1 resposta

0

Existem vários problemas aqui. Primeiro, timeout toma como argumento um comando único . Então, quando você escreve

timeout 10s ping -c 5 www.google.com | awk '{print "from local to google |", $0;}'

o que acontece é mais ou menos isso:

( timeout 10s ping -c 5 www.google.com ) | awk '{print "from local to google |", $0;}'

Ou seja. timeout mata ping , não o tubo inteiro, e assim você recebe de volta o código de saída do tubo (ou seja, awk ).

Para obter o código de saída de timeout , você precisa de um subshell. Mas como timeout toma como argumento um único comando, você precisa escrever isso explicitamente:

timeout 10 sh -c 'ping ... | awk ...' sh

Como alternativa, você poderia apenas definir o tempo do último comando no canal (ou seja, awk ):

ping ... | timeout 10 awk ...

Isso deve funcionar bem para ping | awk , mas pode ser propenso a condições de corrida para outros comandos. E se ping produzir muita saída, você também poderá obter um SIGPIPE, para matar o ouvinte.

Voltando à sua pergunta, você também quer colocar tudo isso em segundo plano. Para obter o código de saída de um comando em segundo plano, você precisa wait :

timeout 10 sh -c 'ping ... | awk ...' sh &
wait $!
echo $?

Infelizmente, bash não possui um wait assíncrono, o que acaba com o propósito de executar os comandos em segundo plano. Você pode, no entanto, executar outros comandos antes de wait .

    
por 07.06.2017 / 08:55