URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8261
[ Назад ]

Исходное сообщение
"Модуль на Perl для Nagios"

Отправлено vagner , 13-Май-09 09:19 
Добрый день! Прошу помощи в проверке написанного скрипта... Сам не могу разобраться в чем проблема:( В перле я новичек, поэтому некоторые куски брал из инета... Суть ошибки:
serverbsd# ./check_cpu
syntax error at ..../nagios/check_cpu line 7, near "= ;"
Excution of ..../nagios/check_cpu aborted due to compilation errors.

Собственно исходный код:

serverbsd# cat ..../nagios/check_cpu
#! /usr/bin/perl -w
use strict;
my $file = '/var/mbmon-nagios';
my $line;

open FD, $file;
#########################
# Строка в которой ошибка
#########################
$line = ;

close FD;

my ($TEMP_proc1, $TEMP_proc2, $FAN_speed_proc1, $FAN_speed_proc2, $nagios_data, $nagios_status, $exit_code);
my @arg;
@arg = split(/;/, $line);

$arg[0] =~ /^TEMPproc1:(.*)$/;
$TEMP_proc1 = $1;
$arg[1] =~ /^TEMPproc2:(.*)$/;
$TEMP_proc2 = $1;
$arg[2] =~ /^FANspeed_proc1:(.*)$/;
$FAN_speed_proc1 = $1;
$arg[3] =~ /^FANspeed_proc2:(.*)$/;

$nagios_data = sprintf("|TEMP_proc1=%f;;;    TEMP_proc2=%f;;;    FAN_speed_proc1=%f;;;    FAN_speed_proc2=%f;;;",$TEMP_proc1,$TEMP_proc2,$FAN_speed_proc1,$FAN_speed_proc2);
if ( $TEMP_proc1 == 0 ) {
    $nagios_status = "CPU status: CRITICAL, temp_proc1 $TEMP_proc1 %";
    $exit_code = 2;
} elsif ( $TEMP_proc1 < 5 ) {
    $nagios_status = "CPU status: WARNING, temp_proc1 $TEMP_proc1 %";
    $exit_code = 1;
} else {
    $nagios_status = "CPU status: OK, temp_proc1 $TEMP_proc1 %";
    $exit_code = 0;    
}

print $nagios_status . $nagios_data;
exit $exit_code;

И вспомогательный файл откуда берутся данные:
serverbsd# cat /var/mbmon-nagios
TEMP_proc1:33.0;TEMP_proc2:34.0;FAN_speed_proc1:1670;FAN_speed_proc2:1962


Буду премного благодарен за помощь!


Содержание

Сообщения в этом обсуждении
"Модуль на Perl для Nagios"
Отправлено phpcoder , 13-Май-09 09:22 
>syntax error at ..../nagios/check_cpu line 7, near "= ;"

[skip]
>$line = ;

Что не понятно? Нужно переменной присвоить значение, а вы ничего не присваивате. В зависимости от контекста нужно присвоить 0 или пустую строку, например.


"Модуль на Perl для Nagios"
Отправлено vagner , 13-Май-09 09:33 
>>syntax error at ..../nagios/check_cpu line 7, near "= ;"
>
>[skip]
>>$line = ;
>
>Что не понятно? Нужно переменной присвоить значение, а вы ничего не присваивате.
>В зависимости от контекста нужно присвоить 0 или пустую строку, например.
>

Насколько я понимаю - у меня в файле с которого берутся данные постоянно первая строка... Но при значении $line = ""; или $line = 0; и прочих вариантах у меня вывыливается куча ошибок:

serverbsd# ..../nagios/check_cpu
Use of uninitialized value in pattern match (m//) at ..../nagios/check_cpu line 16
Use of uninitialized value in pattern match (m//) at ..../nagios/check_cpu line 18
Use of uninitialized value in pattern match (m//) at ..../nagios/check_cpu line 20
Use of uninitialized value in sprintf at ..../nagios/check_cpu line 22
Use of uninitialized value in sprintf at ..../nagios/check_cpu line 22
Use of uninitialized value in sprintf at ..../nagios/check_cpu line 22
Use of uninitialized value in sprintf at ..../nagios/check_cpu line 22
Use of uninitialized value in numeric eq (==) at ..../nagios/check_cpu line 23
Use of uninitialized value in concatenation (.) or string at ..../nagios/check_cpu line 24
CPU status: CRITICAL, temp_proc1 %|TEMP_proc1=0.000000;;; TEMP_proc2=0.000000;;; FAN_speed_proc1=0.000000;;; FAN_cpeed_proc2=0.000000;;;

Я просто в замешательстве:((


"Модуль на Perl для Nagios"
Отправлено phpcoder , 13-Май-09 09:38 
>Насколько я понимаю - у меня в файле с которого берутся данные
>постоянно первая строка... Но при значении $line = ""; или $line
>= 0; и прочих вариантах у меня вывыливается куча ошибок:

Если line это строка, то логичнее было бы ей присвоить пустую строку по умолчанию.

Остальные ошибки это уже _другие_ ошибки, которые у вас встречаются ниже в скрипте, так что вашей следующей задачей является исправть их. В частности большая часть проблем из-за неинциализированных переменных. Причем исправив это (инициализировав их) часть следующих предупреждений просто исчезнет.


"Модуль на Perl для Nagios"
Отправлено vagner , 13-Май-09 09:57 
>[оверквотинг удален]
>>постоянно первая строка... Но при значении $line = ""; или $line
>>= 0; и прочих вариантах у меня вывыливается куча ошибок:
>
>Если line это строка, то логичнее было бы ей присвоить пустую строку
>по умолчанию.
>
>Остальные ошибки это уже _другие_ ошибки, которые у вас встречаются ниже в
>скрипте, так что вашей следующей задачей является исправть их. В частности
>большая часть проблем из-за неинциализированных переменных. Причем исправив это (инициализировав их)
>часть следующих предупреждений просто исчезнет.

Простоте за темность, я как понимаю ошибка первая мне говорит тогда о том, что переменная $arg[1] не инициализированна, но я выше ее вроде как инициализировал такими строками:
my @arg;
@arg = split(/;/, $line);

Подскажите плиз где я включаю тормоз:(((


"Модуль на Perl для Nagios"
Отправлено angra , 13-Май-09 10:13 
И чем же вы ее инициализировали? arg[0] у вас инициализировался пустой строкой из $line, а вот на заполнение всех остальных элементов массива осталась только путоста. А если пустоту разбить(split) на несколько кусочков, то в каждом из них окажется, кто бы мог подумать, пустота.

"Модуль на Perl для Nagios"
Отправлено vagner , 13-Май-09 12:43 
>И чем же вы ее инициализировали? arg[0] у вас инициализировался пустой строкой
>из $line, а вот на заполнение всех остальных элементов массива осталась
>только путоста. А если пустоту разбить(split) на несколько кусочков, то в
>каждом из них окажется, кто бы мог подумать, пустота.

Огромное спасибо!!! Оказалось я там намудрил еще и в тех строках:-[ Я в перле еще полный ноль( Все заработало:) Но если не сложно? расскажите пожалуйста что значит <FD> - оч интересно понять:-[


"Модуль на Perl для Nagios"
Отправлено angra , 16-Май-09 16:31 
open FD, $file; #открыли файл, связав с ним file handler FD
$line =<FD> ; #прочитали из файла _одну_ строку в $line
close FD; #закрыли файл

perl довольно простой язык, по нему есть отличные книги и с ним идет хорошая дока. Что вам мешает этим воспользоваться? Например perldoc -f open выдал бы вам описание open и кучу примеров использования


"Модуль на Perl для Nagios"
Отправлено angra , 13-Май-09 10:09 
Вы бы хоть сказали, что получить хотите ибо скрипт набор почти бессмысленных действий и умещается в однострочник.
Исправление вашей проблемной строки:
$line = <FD>;

P.S. Честное слово любопытно увидеть процессоры для которых критичным является охлаждение, а не нагрев. Вы часом не из параллельной вселенной? :)


"Модуль на Perl для Nagios"
Отправлено vagner , 13-Май-09 12:34 
>Вы бы хоть сказали, что получить хотите ибо скрипт набор почти бессмысленных
>действий и умещается в однострочник.
>Исправление вашей проблемной строки:
>$line = <FD>;
>
>P.S. Честное слово любопытно увидеть процессоры для которых критичным является охлаждение, а
>не нагрев. Вы часом не из параллельной вселенной? :)

Я хотел получить полноценный вывод типа: Status ok и данные по переменным:-[
А вы не могли бы помочь разобраться в том что означает $line = <FD>; Оно избавило от части ошибок - но ошибки про переменные в строке с sprintf остались((


"Модуль на Perl для Nagios"
Отправлено Pahanivo , 13-Май-09 11:01 
уже синтакс еррор в скрипте из 10 строк найти не можем
пипл сильно деградирует (((