Мониторинг внешнего процесса: выход, когда STDOUT соответствует шаблону

Я запускаю системную команду и жду вывода, соответствующего определенному шаблону, например:

open(my $fh, '-|', 'echo line 1; sleep 20; echo line 2');
while (<$fh>) {
    print && last if /1/;
}
close $fh;

Это напечатает line 1 и выйдите из цикла, но не выйдете, пока не завершится внешняя команда.

Как я могу позволить сценарию завершать работу сразу после сопоставления с требуемым выводом?

3 ответа

Решение

Ты можешь отправить TERM подать сигнал на PID, а затем закрыть дескриптор файла без ожидания,

my $pid = open(my $fh, '-|', 'echo line 1;sleep 5; echo line 2') or die $!;
while (<$fh>) {
    print && last if /1/;
}
kill TERM => $pid;
close $fh;

Вы могли бы использовать awk:

echo hello; sleep 2; echo pattern |awk '{print}/pattern/{exit}' 

Это даст вам все линии до появления паттерна, затем выйдите.

Если процесс должен быть запущен после того, как совпадение найдено, добавьте & на команду, чтобы запустить его в фоновом режиме:

open(my $fh, '-|', 'echo line 1 && sleep 20 && echo line 2 &');
while (<$fh>) {
    print && last if /1/;
}
close $fh;
Другие вопросы по тегам