Сигнал SIGALRM
может отправляться или не отправляться во время выполнения вызова system
, поэтому alarm
может быть нестабильным. Это хороший вариант использования для тревоги бедного человека .
my $sys_cmd = "perl child_script.pl 2>&1 | tee logfile.txt";
# step 1. Start your long running command and capture it's process id
my $pid = fork();
if ($pid == 0) {
exec($sys_cmd);
}
# step 2. Start another subprocess for the poor man's alarm.
my $time = 3600;
if (fork() == 0) {
exec("$^X","-e","sleep 1,kill(0,$pid)||exit for 1..$time;kill -9,$pid");
}
# step 3. wait for first process to finish or be killed
my $c = waitpid $pid, 0;
if ($c & 128 == 9) {
print "Process timed out and was killed by the poor man's alarm\n";
} else {
print "Process finished without timing out.\n";
}
Сигнализация бедного человека запускается в отдельном процессе с двумя параметрами: $pid
для мониторинга и $time
ждать. Он периодически проверяет, жив ли отслеживаемый процесс. Если процесс больше не жив, тревога бедняка также прекращается, ничего не делая. После того, как прошло $time
секунд, и отслеживаемый процесс все еще зависает, сигнал тревоги бедного человека посылает процессу сигнал уничтожения, который должен прекратить его.