How can I specify timeout limit for Perl system call?

后端 未结 4 352
花落未央
花落未央 2020-12-24 06:28

Sometimes my system call goes into a never ending state. To, avoid that I want to be able to break out of the call after a specified amount of time.

Is there a way t

相关标签:
4条回答
  • 2020-12-24 07:09

    You can use IPC::Run's run method instead of system. and set a timeout.

    0 讨论(0)
  • 2020-12-24 07:17

    See the alarm function. Example from pod:

    eval {
        local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
        alarm $timeout;
        $nread = sysread SOCKET, $buffer, $size;
        alarm 0;
    };
    if ($@) {
        die unless $@ eq "alarm\n";   # propagate unexpected errors
        # timed out
    }
    else {
        # didn't
    }
    

    There are modules on CPAN which wrap these up a bit more nicely, for eg: Time::Out

    use Time::Out qw(timeout) ;
    
    timeout $nb_secs => sub {
      # your code goes were and will be interrupted if it runs
      # for more than $nb_secs seconds.
    };
    
    if ($@){
      # operation timed-out
    }
    
    0 讨论(0)
  • 2020-12-24 07:22

    I've just used the timeout command in Perl + Linux before, something you can test like this:

    for(0..4){
      my $command="sleep $_";  #your command
      print "$command, ";
      system("timeout 1.1s $command");  # kill after 1.1 seconds
      if   ($? == -1  ){ printf "failed to execute: $!" }
      elsif($?&127    ){ printf "died, signal %d, %scoredump", $?&127, $?&128?'':'no '}
      elsif($?>>8==124){ printf "timed out" }
      else             { printf "child finished, exit value %d", $? >> 8 }
      print "\n";
    }
    

    Output after 4.317 seconds:

    sleep 0, child finished, exit value 0
    sleep 1, child finished, exit value 0
    sleep 2, timed out
    sleep 3, timed out
    sleep 4, timed out
    

    The timeout command is part of all major "normal" Linux distributions a.f.a.i.k, a part of coreutils.

    0 讨论(0)
  • 2020-12-24 07:26

    How about System::Timeout ?

    This module extends system to allow timeout after the specified seconds.

    timeout("3", "sleep 9"); # timeout exit after 3 seconds
    
    0 讨论(0)
提交回复
热议问题