Я бегу моделирования как этотубить предыдущую команду в трубопроводе
./waf --run scratch/myfile | awk -f filter.awk
Как я могу убить команду waf
как только filter.awk
обнаруживает, что что-то произошло (например, после того, как конкретная строка читается)?
Я не могу изменить waf
или myfile
. Я могу только изменить filter.awk
и вышеприведенную команду (очевидно).
Update после комментариев:
waf
не прекращается после полученияSIGPIPE
(? Как это должно быть)- Это порождает дочерние процессы, которые нуждаются в очистке до.
Это my own answer(и вызов).
После работы на ANS @ thatotherguy в @ ответы Криса, я немного упрощен и получил это:
tmp=$(mktemp)
{ ./waf --run scratch/myfile & echo $! > "$tmp"; } | { awk -f filter.awk; pkill -P $(<$tmp); kill $(<$tmp); }
К сожалению, я не мог избавиться от файла tmp
, каждая попытка передать PID
как переменная не удалась.
Я не буду менять принятый ответ (поскольку это был тот, который работал, когда это было действительно), но +1 для тех, кто может упростить больше.
Вы можете использовать 'pkill -P $ (<$ tmp); kill $ (<$ tmp) ', чтобы убить все процессы, PPID которых является вашим экземпляром waf, и, наконец, сам экземпляр waf. –
@thatotherguy Да, с этим изменением не происходит никаких процессов. Вы хотите преобразовать комментарий в ответ, чтобы я мог его принять? Большое спасибо за Вашу помощь! Я бы никогда не решил это сам ... – user000001