in reply to Using SIG{ALRM} within while loop.

I would like to achieve the following: Run a command and capture its output. While waiting for output, run a subroutine every 10 seconds.

Sounds like exactly the kind of job IPC::Run can do:

use warnings; use strict; use IPC::Run qw/ harness timer /; my @cmd = ( 'perl','-le','sleep 60; print "Done!"' ); my $h = harness \@cmd, \undef, \my $out, \my $err, ( my $t = timer 10 ); my $startt = time; $h->start; printf "%2d started\n", time-$startt; while ( $h->pumpable ) { $t->start; $h->pump; printf "%2d pumped\n", time-$startt; } $h->finish; printf "%2d finished\n", time-$startt; print "stdout: <<$out>>\nstderr: <<$err>>\n";

You can also capture the "live" output of the command, The $out and $err variables should be updated as data from the external program comes in.

Update: See IPC::Run::Timer for details on the timings (on my system the delay in the above ends up being about 11 seconds).