Tratando aquí de escribir un script de shell que sigue probando mi servidor y enviarme un correo electrónico cuando se cae.
El problema es que cuando salgo de la conexión ssh, a pesar de ejecutarlo &
al final del comando, como ./stest01.sh &
, automáticamente cae en otra cosa y sigue enviándome correos ininterrumpidamente, hasta que vuelvo a iniciar sesión y lo mato.
#!/bin/bash
while true; do
date > sdown.txt ;
cp /dev/null pingop.txt ;
ping -i 1 -c 1 -W 1 myserver.net > pingop.txt &
sleep 1 ;
if
grep "64 bytes" pingop.txt ;
then
:
else
mutt -s "Server Down!" myemail@address.com < sdown.txt ;
sleep 10 ;
fi
done
linux
shell-script
grep
ping
Vasconcelos1914
fuente
fuente
:
? Para mí tendría sentido que fuera un punto y coma;
...:
no hace nada. Para esto está diseñado. Aquí, en lugar de invertir la prueba, la usan antes para no realizar operacioneselse
.Respuestas:
Cuando GNU
grep
intenta escribir su resultado, fallará con un estado de salida distinto de cero, porque no tiene donde escribir la salida, porque la conexión SSH se ha ido.Esto significa que la
if
declaración siempre toma laelse
rama.Para ilustrar esto (esto no es exactamente lo que está sucediendo en su caso, pero muestra lo que sucede si GNU
grep
no puede escribir su salida):Aquí estamos
grep
para la cadena queecho
produce, pero cerramos ambas secuencias de salida paragrep
que no pueda escribir en ningún lado. Como puede ver, el estado de salida de GNUgrep
es 2 en lugar de 0.Esto es particular de GNU
grep
,grep
en los sistemas BSD no se comportará igual:Para remediar esto, asegúrese de que el script no genere resultados. Puedes hacer esto con
exec >/dev/null 2>&1
. Además, deberíamos usarlogrep
con su-q
opción, ya que no estamos interesados en ver el resultado (generalmente esto también aceleraría,grep
ya que no necesita analizar todo el archivo, pero en este caso hace muy poco) diferencia en velocidad ya que el archivo es muy pequeño).En breve:
También puede usar una prueba
ping
directamente, eliminando la necesidad de uno de los archivos intermedios (y también deshaciéndose del otro archivo intermedio que realmente solo contiene una marca de fecha):En ambas variaciones de la secuencia de comandos anterior, elijo salir del ciclo en caso de que no llegue al host, solo para minimizar la cantidad de correos electrónicos enviados. En su lugar, podría reemplazar el
break
con egsleep 10m
o algo así si espera que el servidor finalmente vuelva a aparecer.También he modificado ligeramente las opciones utilizadas,
ping
ya-i 1
que no tiene mucho sentido-c 1
.Más breve (a menos que desee que continúe enviando correos electrónicos cuando no se pueda acceder al host):
Como un trabajo cron que se ejecuta cada minuto (continuaría enviando correos electrónicos cada minuto si el servidor continúa inactivo):
fuente
>&-
cerrará el fd (como en, el descriptor de archivo 1 está cerrado), mientras que cerrar la conexión SSH tendrá un efecto diferente (un descriptor de archivo seguirá existiendo, pero no conectado a nada en el otro lado). Creo que el punto sigue en pie, que es que GNU grep sale de un valor distinto de cero si intenta escribir una salida y eso falla. Sí, la mejor solución es verificar directamente el estado de salida del ping.exec </dev/null >/dev/null 2>&1
cerca del comienzo. De esa manera, si, por ejemplo,ping
decide escribir algo para stderr, no causará ningún problema./dev/null
aquí, pero resolví la salida. Gracias por la sugerencia.