监视外部进程:当STDOUT匹配模式时退出

时间:2014-05-29 07:41:43

标签: perl io perl-io

我正在运行系统命令并等待与特定模式匹配的输出,例如:

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

这将打印line 1并离开循环但不会退出,直到外部命令完成。

如何在匹配所需输出后立即允许脚本退出?

3 个答案:

答案 0 :(得分:3)

您可以向PID发送TERM信号,然后关闭文件句柄而无需等待,

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;

答案 1 :(得分:0)

您可以使用awk

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

这将为你提供直到模式发生的所有行,然后退出。

答案 2 :(得分:-1)

如果在找到匹配项后要继续运行该进程,请在命令后附加&以在后台运行它:

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