시간이 걸리는 기능은 C로 작성되어 사용자 정의 신호 처리기를 안전하게 사용할 수 없습니다.
당신은 강제로 프로그램을 종료하는 것에 대해 걱정하지 않으므로, 실행하는 데 너무 오랜 시간이 걸리면 프로그램을 강제 종료하기 위해 신호 처리기없이 alarm
을 사용하고, 래퍼를 사용하여 Nagios에 올바른 응답을 제공하는 것이 좋습니다 .
변경
/path/to/program some args
/path/to/timeout_wrapper 30 /path/to/program some args
에 다음
timeout_wrapper
입니다 :
#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw(WNOHANG);
use Time::HiRes qw(sleep time);
sub wait_for_child_to_complete {
my ($pid, $timeout) = @_;
my $wait_until = time + $timeout;
while (time < $wait_until) {
waitpid($pid, WNOHANG)
and return $?;
sleep(0.5);
}
return undef;
}
{
my $timeout = shift(@ARGV);
defined(my $pid = fork())
or exit(3);
if (!$pid) {
alarm($timeout); # Optional. The parent will handle this anyway.
exec(@ARGV)
or exit(3);
}
my $timed_out = 0;
my $rv = wait_for_child_to_complete($pid, $timeout);
if (!defined($rv)) {
$timed_out = 1;
if (kill(ALRM => $pid)) {
$rv = wait_for_child_to_complete($pid, 5);
if (!defined($rv)) {
kill(KILL => $pid)
}
}
}
exit(2) if $timed_out;
exit(3) if $rv & 0x7F; # Killed by some signal.
exit($rv >> 8); # Expect the exit code to comply with the spec.
}
가 Nagios Plugin Return Codes를 사용합니다. 시간 초과는 실제로 2
을 반환합니다.
'Temporizador'는 자식 중 하나가 ARLM 신호에 의해 죽을 때 쉘에 의해 출력됩니다. '$? '는 여기에 자녀의 종료 코드가 아닙니다. 그것은 자식을 죽인 신호의 번호입니다. (14) OR과 128. – ikegami