Perl вызывается из Nagios: localtime возвращает время последнего запуска демона nagios

Я хотел добавить журнал отладки в сценарий Perl, который я создал как плагин Nagios. Он отлично работает при запуске из командной строки, но когда его вызывает Nagios, «localtime» возвращает время последнего перезапуска демона nagios3 (в данном случае — вчера днем).

Запуск Perl v5.14.2 и Nagios 3.2.3 на Ubuntu Server 12.04 LTS.

сценарий (частичный):

#!/usr/bin/perl
use POSIX;

my $result = 0;
my $IP=$ARGV[0];

# actual processing here...

open (LOGFILE, ">>/var/log/nagios3/check_pisystem.log");
print LOGFILE strftime "%F %T%z (%Z)", localtime $^T;
print LOGFILE "," . $IP . "," . $result . "\n";
close (LOGFILE);

Содержимое файла журнала после запуска: строки в 10: xx были добавлены путем ручного запуска сценария из командной строки. Другие строки являются результатом вызова nagios с 4 разных IP-адресов с 5-минутными интервалами (каждый).

2013-07-29 15:18:24+0200 (CEST),10.3.4.83,0
2013-07-29 15:18:24+0200 (CEST),10.3.3.83,0
2013-07-30 10:24:51+0200 (CEST),10.3.0.83,0
2013-07-29 15:18:24+0200 (CEST),10.3.1.83,1
...
2013-07-29 15:18:24+0200 (CEST),10.3.3.83,1
2013-07-29 15:18:24+0200 (CEST),10.3.1.83,0
2013-07-29 15:18:24+0200 (CEST),10.3.0.83,0
2013-07-29 15:18:24+0200 (CEST),10.3.4.83,0
2013-07-30 10:46:54+0200 (CEST),10.3.0.83,0

person Luc VdV    schedule 30.07.2013    source источник
comment
Извините, сам нашел. Строка форматирования локального времени была скопирована из другого SO-вопроса, номер 1814196, который быстро превратился в гггг мм дд ччммсс в perl. Пример кода в верхнем ответе использовал $^T, что обозначает время запуска этой программы :( «местное время», и это работает.   -  person Luc VdV    schedule 30.07.2013
comment
Ссылка на рассматриваемую статью: stackoverflow.com/questions/1814196/   -  person Luc VdV    schedule 30.07.2013


Ответы (1)


Проблема заключалась в том, как вы указали в комментарии, что вы передавали $^T (который содержит время запуска программы) в localtime().

Как вы заметили, вы можете сказать localtime(time) - или даже проще, просто ничего не передавать в локальное время - perldoc -f localtime объясняет:

If EXPR is omitted, "localtime()" uses the current time (as returned by time(3)).

Итак, просто скажите localtime(), и ваши проблемы исчезнут :)

person David Precious    schedule 30.07.2013