Мониторинг внешнего процесса: выход, когда 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;