Abgebildetes Programm abbrechen, wenn eine bestimmte Warnung ausgegeben wird

387
Camille Goudeseune

Mein Bash 4-Skript ruft ein Programm Peines Drittanbieters auf (eines, das ich nicht neu kompilieren kann), das Warnungen an STDOUT ausgibt. Beim Drucken yikeswird auch eine Endlosschleife eingegeben. Wenn ich also ein Skript erkenne yikes, wie kann ich sofort die PKontrolle an mein Skript zurückgeben? (Und Psonst normal beenden.)

Möglicherweise nützliche Fragmente:

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

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

wait

2

2 Antworten auf die Frage

1
Camille Goudeseune
coproc ./P grep -q -m1 yikes <&$ && [[ $COPROC_PID ]] && kill -9 $COPROC_PID 

Demo:

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

Gefunden unter https://stackoverflow.com/a/26779617/2097284 .

Https://unix.stackexchange.com/questions/86270/how-do-you-use-the-command-coproc-in-bash erklärt jedoch, warum Named Pipes besser sind (obwohl Deadlock hier nicht möglich ist) und warum expectist es noch besser?

1
Kamil Maciorowski

Verwenden expect:

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

Diese Verwendung ist möglicherweise nicht optimal, dennoch expectist es das richtige Werkzeug für den Job.

Wenn Pmehr gedruckt yikeswird, wird das gebrochene Rohr bemerkt, und das killallwird nicht benötigt:

P | expect -c 'expect -timeout -1 yikes' 
Aktuelle Ubuntus enthalten es standardmäßig nicht. "sudo apt-get install erwarten"? Camille Goudeseune vor 6 Jahren 0
In meinem Fall druckt P nach yikes eine * unendlich * Anzahl von Zeilen! Camille Goudeseune vor 6 Jahren 0