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
grepintenta 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
ifdeclaración siempre toma laelserama.Para ilustrar esto (esto no es exactamente lo que está sucediendo en su caso, pero muestra lo que sucede si GNU
grepno puede escribir su salida):Aquí estamos
greppara la cadena queechoproduce, pero cerramos ambas secuencias de salida paragrepque no pueda escribir en ningún lado. Como puede ver, el estado de salida de GNUgrepes 2 en lugar de 0.Esto es particular de GNU
grep,grepen 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 usarlogrepcon su-qopción, ya que no estamos interesados en ver el resultado (generalmente esto también aceleraría,grepya 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
pingdirectamente, 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
breakcon egsleep 10mo algo así si espera que el servidor finalmente vuelva a aparecer.También he modificado ligeramente las opciones utilizadas,
pingya-i 1que 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>&1cerca del comienzo. De esa manera, si, por ejemplo,pingdecide escribir algo para stderr, no causará ningún problema./dev/nullaquí, pero resolví la salida. Gracias por la sugerencia.