in reply to Need Function for Timing out shell commands

I gather from eyepopslikeamosquito's post that a pure-Perl solution that both kills the process on timeout and captures its exit status otherwise is non-trivial.

Not sure what O/S you are using. In Unix/Linux, I would be surprised to find any networking command that doesn't have a timeout option, so I would check that first. Alternatively, there is the timeout command, which would solve your problem entirely.

  • Comment on Re: Need Function for Timing out shell commands

Replies are listed 'Best First'.
Re^2: Need Function for Timing out shell commands
by salva (Canon) on Sep 15, 2011 at 08:07 UTC
    I gather from eyepopslikeamosquito's post that a pure-Perl solution that both kills the process on timeout and captures its exit status otherwise is non-trivial.

    It is not trivial, but is is not so complex either:

    # untested! use POSIX qw(WNOHANG _exit); use Errno qw(ECHILD); local $SIG{CHLD} = sub {}; # this do-nothing sub ends the # select below on SIGCHLD my $pid = fork; if (!$pid) { defined $pid or die "fork failed: $!"; do { exec @cmd }; # warnings friendly! _exit(1); } my $start = time; while (1) { my $rc = waitpid ($pid, WNOHANG); last if $rc == $pid; last if $rc < 0 and $! == ECHILD; select (undef, undef, undef, 1); kill INT => $pid if time > $start + $timeout; }

    Using AnyEvent it would be even easier.