Как я могу убить системный вызов Perl после тайм-аута? - PullRequest
3 голосов
/ 21 апреля 2010

У меня есть Perl-скрипт, который я использую для запуска инструмента обработки файлов, который запускается с помощью обратных галочек. Проблема в том, что иногда инструмент зависает, и его необходимо убить, чтобы обработать остальные файлы.

Каков наилучший способ применить тайм-аут, после которого родительский скрипт уничтожит зависший процесс?

В данный момент я использую:

foreach $file (@FILES) {
    $runResult = `mytool $file >> $file.log`;
}

Но когда mytool зависает через n секунд, я бы хотел убить его и перейти к следующему файлу.

Ответы [ 2 ]

6 голосов
/ 21 апреля 2010

Я бы, вероятно, не использовал `` для этого. Вместо этого я бы open() набрал команду с |, чтобы она выполнялась асинхронно. Это вернет pid. Затем вы можете сделать неблокирующее wait() в цикле с засыпанием, которое после определенного количества попыток безуспешно выдает сигнал ребенку pid.

3 голосов
/ 21 апреля 2010

Вам необходимо установить $ SIG {'ALRM'} в подпрограмму обработчика, а затем вызвать функцию тревоги со значением тайм-аута. Что-то вроде:

$SIG{'ALRM'} = handler;
foreach $file (@FILES) {
  alarm(10);
  $runResult = `mytool $file >> $file.log`;
  alarm(0);
}

sub handler {
  print "There was a timeout\n";
}

Это должно вызвать подпрограмму обработчика через 10 секунд. Установка будильника на 0 отключает будильник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...