Добрый день! Прошу помощи в проверке написанного скрипта... Сам не могу разобраться в чем проблема:( В перле я новичек, поэтому некоторые куски брал из инета... Суть ошибки:
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
Буду премного благодарен за помощь!
>syntax error at ..../nagios/check_cpu line 7, near "= ;"[skip]
>$line = ;Что не понятно? Нужно переменной присвоить значение, а вы ничего не присваивате. В зависимости от контекста нужно присвоить 0 или пустую строку, например.
>>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;;;Я просто в замешательстве:((
>Насколько я понимаю - у меня в файле с которого берутся данные
>постоянно первая строка... Но при значении $line = ""; или $line
>= 0; и прочих вариантах у меня вывыливается куча ошибок:Если line это строка, то логичнее было бы ей присвоить пустую строку по умолчанию.
Остальные ошибки это уже _другие_ ошибки, которые у вас встречаются ниже в скрипте, так что вашей следующей задачей является исправть их. В частности большая часть проблем из-за неинциализированных переменных. Причем исправив это (инициализировав их) часть следующих предупреждений просто исчезнет.
>[оверквотинг удален]
>>постоянно первая строка... Но при значении $line = ""; или $line
>>= 0; и прочих вариантах у меня вывыливается куча ошибок:
>
>Если line это строка, то логичнее было бы ей присвоить пустую строку
>по умолчанию.
>
>Остальные ошибки это уже _другие_ ошибки, которые у вас встречаются ниже в
>скрипте, так что вашей следующей задачей является исправть их. В частности
>большая часть проблем из-за неинциализированных переменных. Причем исправив это (инициализировав их)
>часть следующих предупреждений просто исчезнет.Простоте за темность, я как понимаю ошибка первая мне говорит тогда о том, что переменная $arg[1] не инициализированна, но я выше ее вроде как инициализировал такими строками:
my @arg;
@arg = split(/;/, $line);Подскажите плиз где я включаю тормоз:(((
И чем же вы ее инициализировали? arg[0] у вас инициализировался пустой строкой из $line, а вот на заполнение всех остальных элементов массива осталась только путоста. А если пустоту разбить(split) на несколько кусочков, то в каждом из них окажется, кто бы мог подумать, пустота.
>И чем же вы ее инициализировали? arg[0] у вас инициализировался пустой строкой
>из $line, а вот на заполнение всех остальных элементов массива осталась
>только путоста. А если пустоту разбить(split) на несколько кусочков, то в
>каждом из них окажется, кто бы мог подумать, пустота.Огромное спасибо!!! Оказалось я там намудрил еще и в тех строках:-[ Я в перле еще полный ноль( Все заработало:) Но если не сложно? расскажите пожалуйста что значит <FD> - оч интересно понять:-[
open FD, $file; #открыли файл, связав с ним file handler FD
$line =<FD> ; #прочитали из файла _одну_ строку в $line
close FD; #закрыли файлperl довольно простой язык, по нему есть отличные книги и с ним идет хорошая дока. Что вам мешает этим воспользоваться? Например perldoc -f open выдал бы вам описание open и кучу примеров использования
Вы бы хоть сказали, что получить хотите ибо скрипт набор почти бессмысленных действий и умещается в однострочник.
Исправление вашей проблемной строки:
$line = <FD>;P.S. Честное слово любопытно увидеть процессоры для которых критичным является охлаждение, а не нагрев. Вы часом не из параллельной вселенной? :)
>Вы бы хоть сказали, что получить хотите ибо скрипт набор почти бессмысленных
>действий и умещается в однострочник.
>Исправление вашей проблемной строки:
>$line = <FD>;
>
>P.S. Честное слово любопытно увидеть процессоры для которых критичным является охлаждение, а
>не нагрев. Вы часом не из параллельной вселенной? :)Я хотел получить полноценный вывод типа: Status ok и данные по переменным:-[
А вы не могли бы помочь разобраться в том что означает $line = <FD>; Оно избавило от части ошибок - но ошибки про переменные в строке с sprintf остались((
уже синтакс еррор в скрипте из 10 строк найти не можем
пипл сильно деградирует (((