У меня есть команда, которую я выполняю с помощью OPEN с помощью pipe, и я хочу установить тайм-аут в 10 секунд и прервать подпроцесс, если время выполнения превышает это. Однако мой код просто заставляет программу зависать. Почему мой ALARM не доставлен должным образом?Обработчик процесса -SIGALRM не доставлен - Perl
my $pid = 0;
my $cmd = "someCommand";
print "Running Command # $num";
eval {
local $SIG{ALRM} = sub {
print "alarm \n";
kill 9, $pid;
};
alarm 10;
pid = open(my $fh, "$cmd|");
alarm 0;
};
if([email protected]) {
die unless [email protected] eq "alarm \n";
} else {
print $_ while(<$fh>);
}
EDIT:
Так Из приведенных ниже ответов, это то, что у меня есть:
my $pid = open(my $fh, qq(perl -e 'alarm 10; exec \@ARGV; die "exec: $!\n" ' $cmd |));
print $_ while(<$fh>);
Но эта печать УСТ.БУДИЛЬНИК на консоль, когда тревоги таймаут ... тогда I dont указать это где-нибудь в коде ... как я могу избавиться от этого, и где бы я поместил пользовательский обработчик событий тревоги?
Спасибо!
Спасибо за это. Есть ли что-нибудь, что я могу сделать, чтобы сбросить будильник для каждого exec? Как бы я справился с тем, что сигнал тревоги поднят? Как и в, где бы я поместил код обработки? –
Спасибо, @ikegami. Я сопротивлялся этому, потому что я подозреваю, что «someCommand» на самом деле может быть «someCommand --w = = разделенные пробелами аргументы». – pilcrow
@ user6561, аварийный сброс _is_ для каждого exec(). Это уникально для каждого порожденного процесса. Что касается обработки ошибок, вы заметили бы смерть сигнала в '$?' После того, как порожденный процесс завершится. В моей системе это '$? & 127 == 14' (14 - SIGALRM). Подробнее см. В документах для ['system'] (http://perldoc.perl.org/functions/system.html). – pilcrow