Команда убийства в подоболочке

Я хочу связать файл и вывести его содержимое, пока не будет достигнут определенный шаблон. В настоящее время я делаю это:

grep -q 'pattern' <(tail -F /my/file | tee /dev/stderr)
exit 0

Это отлично работает, но проблема здесь в том, что даже когда этот процесс bash завершится, будет зависать процесс для tail. Это проблема для Rundeck, так как он будет думать, что моя команда еще не закончилась. Я пробовал эти варианты:

  1. Используйте хвост --pid=$$. Это работает в Linux, но я работаю на Mac, хвостовая версия которого не поддерживает --pid.

  2. Используйте «убить 0». Это действительно убьет хвостовой процесс, но также приведет к сбою Rundeck (так в оригинале).

Любые другие предложения?


person user1013725    schedule 23.05.2014    source источник


Ответы (1)


Вместо этого вы должны группировать команды:

{ tail -F /my/file | tee /dev/stderr; } | grep -q 'pattern'

Теперь grep отправит SIGPIPE предыдущей команде в конвейере, когда найдет шаблон.

person devnull    schedule 23.05.2014
comment
Я пробовал это, но теперь мой процесс bash вообще не завершается (хотя на выходе появляется шаблон). - person user1013725; 23.05.2014
comment
@user1013725 user1013725 Это странно. Я написал это после тестирования! - person devnull; 23.05.2014
comment
Ах, я думаю, это потому, что шаблон — это последняя строка в файле. Если что-то приходит после, оно, кажется, закончилось. - person user1013725; 23.05.2014