прервать порожденную программу, когда она печатает определенное предупреждение

344
Camille Goudeseune

Мой сценарий Bash 4 вызывает стороннюю программу P(которую я не могу перекомпилировать), которая выводит предупреждения в STDOUT. Когда он печатает yikes, он также входит в бесконечный цикл. Итак, когда я обнаруживаю yikes, как я могу немедленно остановить Pи вернуть управление моему сценарию? (И пусть Pзакончит нормально в противном случае.)

Возможно полезные фрагменты:

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

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

wait

2

2 ответа на вопрос

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

Демо-версия:

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 

Найдено по адресу https://stackoverflow.com/a/26779617/2097284 .

Однако https://unix.stackexchange.com/questions/86270/how-do-you-use-the-command-coproc-in-bash объясняет, почему именованные каналы лучше (хотя тупик здесь невозможен), и почему expectеще лучше.

1
Kamil Maciorowski

Используйте expect:

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

Такое использование может быть неоптимальным, но все же expectявляется правильным инструментом для работы.

Если Pпечатать больше после yikesэтого, он заметит сломанную трубу, так что killallэто не нужно:

P | expect -c 'expect -timeout -1 yikes' 
Последние Ubuntus не включают его по умолчанию. `sudo apt-get install Ожидается`? Camille Goudeseune 7 лет назад 0
В моем случае после yikes P печатает * бесконечное число * строк! Camille Goudeseune 7 лет назад 0

Похожие вопросы