davidin073 escribiste:Es muy extraño pero al probar tu último ejemplo, ejecutando en la consola, el resultado es bueno, pero Nagios muestra el estado como si retornase 1 y muestra la línea impresa que está fuera del for().
Pues si funciona en consola, pero a Nagios le sale el mensaje de error, es que quizás no ha tenido los permisos necesarios para ejecutar el asterisk.
Una pregunta... Nagios, ¿qué espera? ¿El resultado (estado,
status) de la ejecución, o un texto por la entrada estándar?
davidin073 escribiste:Y eso no sucede por este motivo, con el código del anterior mensaje:
Using bash Syntax Highlighting
[nagios@localhost SCRIPTS]$ ./dahdi.pl
Use of uninitialized value in numeric eq (==) at ./dahdi.pl line 17.
La tarjeta Wildcard TDM400P no tiene alarmas.
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Es decir, es cierto que sigue ejecutando el código pero ejecuta también lo que está dentro del if{}, por tanto, sigue mostrando la línea de no hay alarmas y sigue retornando 0.
Es que el problema está en que NO inicializas el valor de $return.
my $return;Por defecto, tendrá el valor 'undef'.
Supongamos que, en la línea siguiente, se ejecuta el Asterisk, y falla. Luego entonces, $return NO obtiene el valor 0 (el bucle for() no se ejecuta o se ejecuta pero no hay
Ok) y sigue valiendo 'undef'. Llega al if(). Allí, sale el mensaje de aviso (gracias a Larry tenemos 'warnings' activado) -que tu muestras- de que estás haciendo una comparación con una variable que NO ha sido inicializada. PERO ES UN AVISO. Perl, lo que hará, es una conversión del valor 'undef' a valor numérico... ¿sabes a qué valor?... pues a CERO.
Es por ESA razón por la que el programa entrará en el if(), tanto en el caso de que Asterisk esté
Ok, como si falla su ejecución.
La solución, ya te lo vuelvo a decir: inicializa el $return con el valor de
critical (u otro valor, que no sea 0 ni 'undef').
De esa manera,
* si el Asterisk funciona, se podrá actualizar $return dentro del for() (o no, si no está
Ok).
* si el Asterisk falla, ya tenemos un valor de $return puesto (a
critical)
* al llegar al if(), sabemos que $return habrá sido modificado a 0
=>SOLO<= si Asterisk devolvió un OkYa has visto como mi solución funciona en consola. Otro tema es ver por qué Nagios no lo ejecuta tan bien como la consola.
¿No tiene Nagios un registro (log) de actividad para ver lo que hace?