abortar o programa gerado quando ele imprime um aviso específico

2

Meu script Bash 4 chama um programa de terceiros P (um que não posso recompilar), que imprime avisos para STDOUT. Quando ele imprime yikes , ele também entra em um loop infinito. Então, quando eu detecto um yikes , como posso parar imediatamente P e retornar o controle para o meu script? (E deixe P terminar normalmente de outra forma.)

Fragmentos possivelmente úteis:

(echo $BASHPID > /tmp/subpid; ./P | tee /tmp/Pout ) &

tail -f /tmp/Pout | grep -m1 yikes && kill -9 $(cat /tmp/subpid)

wait

    
por Camille Goudeseune 19.10.2017 / 18:33

2 respostas

1

Use expect :

P | { expect -c 'expect -timeout -1 yikes' && killall P ; }

Esse uso pode não ser o ideal, mas expect é a ferramenta certa para o trabalho.

Se P imprimir mais depois de yikes , ele notará o canal quebrado, portanto, o killall não é necessário:

P | expect -c 'expect -timeout -1 yikes'
    
por 19.10.2017 / 19:13
1
coproc ./P
grep -q -m1 yikes <&${COPROC[0]} && [[ $COPROC_PID ]] && kill -9 $COPROC_PID

Demo:

coproc { sleep 1; echo yikes; sleep 2; }; grep -q -m1 yikes <&${COPROC[0]} && [[ $COPROC_PID ]] && kill -9 $COPROC_PID
coproc { sleep 1; echo zzzzz; sleep 2; }; grep -q -m1 yikes <&${COPROC[0]} && [[ $COPROC_PID ]] && kill -9 $COPROC_PID

Encontrado no link .

No entanto, o link explica por que pipes nomeados são melhores (embora o deadlock não seja possível aqui), e por que expect é melhor ainda.

    
por 19.10.2017 / 18:50