Usando watch para ejecutar un script de shell, pero el script deja de funcionar

Usando watch para ejecutar un script de shell, pero el script deja de funcionar

Por eso quiero estar atento a la conectividad de mi red para poder realizar un informe para mi ISP. (Parece que el módem se apaga durante unos 30 a 60 segundos aproximadamente una vez al día)

Así que copié este pequeño y práctico script.

http://www.cyberciti.biz/tips/simple-linux-and-unix-system-monitoring-with-ping-command-and-scripts.html

Y ejecutándolo con

watch -n 15 ./ping-test.sh

Lo he estado probando desconectando mi módem.

La primera vez que Watch ejecuta el script después de que se apaga la red, funciona bien (envía algún correo electrónico) y luego desaparece. Una vez que se restablece la red, el script "finaliza" y luego el reloj lo ejecuta nuevamente.

Así que recibo correo para cuando la red se caiga, pero no para cuánto tiempo estuvo inactiva.

Si ejecuto el script directamente desde la línea de comando, se ejecuta (correo electrónico) y luego sale.

¿Alguna idea de por qué? ¿Cómo puedo hacer que el script siga ejecutándose una vez que la red no funciona?

Respuesta1

silbidose colgará si no puede alcanzar su objetivo y quizás esa sea la razón por la que el script deja de funcionar porque elsilbidotodavía está esperando una respuesta. Intente agregar el-w fecha límiteo-W se acabó el tiempoopción a lasilbido.

Respuesta2

Puedes hacer esto en tiempo real usando "ip monitor". Esto generará cualquier evento, como la eliminación de la dirección IP o la adición del estado del enlace que cambia de operativo a desconectado, o un cambio de ruta de alguna manera.

ip monitor all >> /some/log.log &

Debes abrir en modo agregar. Si desea dejar que se ejecute fuera de la terminal, simplemente puede rechazar el trabajo con "disown %1".

Si también necesita marcas de tiempo, hay un par de maneras. Una manera fácil es usar inotifywait para verificar si el archivo se actualiza y luego agregarle su fecha. Sería fácil hacer lo anterior y esto en un script de shell y tal vez repudiarlo para obtener

ip monitor all >> /some/log.log &
while inotifywait -qq -e modify /some/log.log; do 
  sleep 0.2;
  date >>/root/mon.log; 
done

Disfrutar

Respuesta3

Su solución con el comando 'ver' no es buena. Intentaría resolver esto con algo como esto:

#!/bin/bash
HOSTS="foo.bar foo2.bar"
COUNT=4
while :
do
    for myHost in $HOSTS
    do
      count=$(ping -c $COUNT $myHost | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
      if [ $count -eq 0 ]; then
        # 100% failed 
        echo "Host : $myHost is down (ping failed) at $(date)"
      fi
      done
sleep 15 # here is your refresh rate
done

y luego ejecútelo como un script normal: ./script_name.sh

terminar con CTRL+C.

Respuesta4

Desaparece porque ya está terminado pero depende de un proceso principal, watchcomando que aún está vivo.

Así que recibo correo para cuando la red se caiga, pero no para cuánto tiempo estuvo inactiva.

Ese script ya imprime la fecha en la que el sistema remoto está inactivo:

echo "Host : $myHost is down (ping failed) at $(date)" | mail -s "$SUBJECT" $EMAILID

¿Cómo puedo hacer que el script siga ejecutándose una vez que la red no funciona?

Está pingfuncionando, -c 1por lo que se detendrá después de enviar 1 paquete ECHO_REQUEST.

Ponlo en cron para que se ejecute cada minutos:

*/1 * * * * /path/to/your/script

información relacionada