2

Мой сценарий 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
coproc ./P
grep -q -m1 yikes <&${COPROC[0]} && [[ $COPROC_PID ]] && kill -9 $COPROC_PID

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

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

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

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

1

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

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

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

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

P | expect -c 'expect -timeout -1 yikes'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .