2013-02-15 4 views
2

Я бегу моделирования как этотубить предыдущую команду в трубопроводе

./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 для тех, кто может упростить больше.

+0

Вы можете использовать 'pkill -P $ (<$ tmp); kill $ (<$ tmp) ', чтобы убить все процессы, PPID которых является вашим экземпляром waf, и, наконец, сам экземпляр waf. –

+0

@thatotherguy Да, с этим изменением не происходит никаких процессов. Вы хотите преобразовать комментарий в ответ, чтобы я мог его принять? Большое спасибо за Вашу помощь! Я бы никогда не решил это сам ... – user000001

ответ

2

Что делает это сложно, что waf ведет себя плохо, не выходя при трубные ломается, и он нерестится от второго процесса, который мы также должны избавиться от:

tmp=$(mktemp) 
cat <(./waf --run scratch/myfile & echo $! > "$tmp"; wait) | awk -f filter.awk; 
pkill -P $(<$tmp) 
kill $(<$tmp) 
  • Мы используем <(process substitution) для запуска waf в фоновом режиме и записать его pid в файл temp.
  • Мы используем cat в качестве посредника для передачи данных из этого процесса в awk, так как cat выйдет правильно, когда труба сломана, что позволит конвейеру закончить.
  • Когда трубопровод будет сделано, мы убиваем все процессы, которые waf икрили (Материнской PID)
  • Наконец убить waf сам.
3

заявление. waf должен выйти, как только труба, соединяющая ее с awk, закрывается.

+0

Пробовал с 'exit -1' и' exit 0'. 'awk' завершается, но' waf' продолжает работать. – user000001

+1

Либо 'waf' выводит больше строк вскоре после выхода awk? В противном случае он не заметит, что awk больше не существует. –

+0

@thatotherguy Я отфильтровал строки, начинающиеся с 'TraceDelay' для тестирования. Без выхода он печатает непрерывно. С выходом останавливается печать, но приглашение не возвращается (нажатие кнопки не помогает). Я обновлю вопрос, чтобы уточнить – user000001

1

Когда awk выходит, waf получает SIGPIPE в следующий раз, он пытается записать вывод, который должен вызвать его, чтобы выйти, если тот, кто писал waf намеренно установить его игнорировать SIGPIPE сек говорю это, чтобы выйти, в этом случае вы будете должны убить его вручную с помощью kill или некоторых таких. Что-то вроде:

./waf --run scratch/myfile | (awk -f filter.awk; killall waf) 

Вам может понадобиться -KILL возможность killall если waf игнорирует все сигналы выхода.

+0

С этим я получил 'waf: no process found', но нет подсказки. – user000001

+1

Также будет ли 'killall' влиять на другие экземпляры' waf', запущенные из того же скрипта? – user000001

Смежные вопросы