четверг, 4 октября 2012 г.

How to make alarm in Perl

o> У меня есть скрипт. Я хочу, что бы если он допустим работает больше минуты я
o> хочу его прибить. Можно ли как нить это реализовать ?

  $SIG{ALRM} = sub { die "alarm\n" };

  eval {
    alarm ($TIMEOUT);
    . . .
    alarm(0);
  };

  if ($@ && $@ ne "alarm\n") {
   print "Unknow error $@" ;
  } elsif ($@) {
   print "TimeOut";
  } else {
   print "Ok";
  }
 
Reference: http://www.opennet.ru/base/dev/alarm_timeout.txt.html 
======================================================================================
 
eval {
        local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n обязателен
        alarm $timeout;
        $nread = sysread SOCKET, $buffer, $size;
        alarm 0;
    };
    
    # если вышли по тайм-ауту $timeout
    if ($@) {
        die unless $@ eq "alarm\n";   # обработка неожиданных ошибок
    }
    # все в порядке, сработали пределах установленного времени $timeout
    else {
            #...
    }
 
Reference: http://blog.perl5doc.ru/perlfunc/2011/03/perlfunc-alarm.html 
======================================================================================
 
Есть функция solve которая в 0.001% случаях может зависнуть.  Ее
нужно прервать по таймауту.

Пишу:

      warn "started solve\n";
      my $solution;
      eval {
        local $SIG{ALRM} = sub { die };
        alarm 5;
        $solution = solve($lp);
        alarm 0;
      };
      my $is_timeout = $@;
      delete_lp($lp);
      if ($is_timeout) {
        warn "time out\n";
      } else
      {
        warn "sol $solution\n";
        if ($solution == $INFEASIBLE)
        {
          # INCONSISTENCIES DETECTED
          return 0;
        }
      }

Пишет в stderr "started solve" и все, по таймауту не выходит,
висит в 100% CPU.  В чем проблема?  как решить?
 
Reference: http://www.linux.org.ru/forum/development/2431784 



Комментариев нет:

Отправить комментарий