3

I'm running a system command and waiting for output matching a specific pattern, e.g:

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

This will print line 1 and leave the loop but won't exit until the external command has completed.

How can I allow the script to exit immediately after matching the required output?

RobEarl
  • 7,862
  • 6
  • 35
  • 50

3 Answers3

3

You can send TERM signal to the PID and then close file handle without waiting,

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;
mpapec
  • 50,217
  • 8
  • 67
  • 127
0

You could use awk:

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

This will give you all the lines till pattern occurs, then exit.

Mark Setchell
  • 191,897
  • 31
  • 273
  • 432
-1

If the process is to be left running after the match is found, append an & to the command to run it in the background:

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