przerwaj spawnowany program, kiedy wypisze określone ostrzeżenie

2

Mój skrypt Bash 4 wywołuje program innej firmy P(taki, którego nie mogę ponownie skompilować), który drukuje ostrzeżenia do STDOUT. Kiedy drukuje yikes, wchodzi również w nieskończoną pętlę. Więc kiedy wykryję a yikes, jak mogę natychmiast zatrzymać Pi przywrócić kontrolę nad skryptem? (I niech Pnormalnie skończy się inaczej.)

Prawdopodobnie przydatne fragmenty:

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

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

wait

Camille Goudeseune
źródło

Odpowiedzi:

1

Użyj expect:

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

To użycie może nie być optymalne, nadal expectjest odpowiednim narzędziem do pracy.

Jeśli Ppóźniej wydrukuje więcej yikes, zauważy przerwaną rurę, więc killallnie jest potrzebna:

P | expect -c 'expect -timeout -1 yikes'
Kamil Maciorowski
źródło
Najnowsze Ubuntus domyślnie go nie obejmuje. sudo apt-get install expect?
Camille Goudeseune,
W moim przypadku po wydrukowaniu P drukuje nieskończoną liczbę linii!
Camille Goudeseune,
1
coproc ./P
grep -q -m1 yikes <&${COPROC[0]} && [[ $COPROC_PID ]] && kill -9 $COPROC_PID

Próbny:

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

Znaleziono z https://stackoverflow.com/a/26779617/2097284 .

Jednak https://unix.stackexchange.com/questions/86270/how-do-you-use-the-command-coproc-in-bash wyjaśnia, dlaczego nazwane potoki są lepsze (chociaż impas nie jest tutaj możliwy), i dlaczego expectjest jeszcze lepiej.

Camille Goudeseune
źródło