Entonces tengo un servidor y una computadora cliente que debo tener ejecutándose en la red todo el tiempo. A veces, porque estoy ejecutando mi computadora cliente en WLAN
la red, se cae y necesito reiniciarla. Como quiero garantizar que existe una conexión activa entre mi servidor y mi cliente, debo tener alguna forma de enviar una verificación periódica a la computadora cliente para saber si está esencialmente activa o responde.
Mi problema
Primero necesito reiniciar la red si el cliente no recibe ningún ping de conectividad de mi servidor dentro de cinco minutos y si la red se ha reiniciado y todavía no recibe ningún paquete de mi servidor, reiniciará toda la máquina Linux. .
La idea es que mi servidor actúe como un perro guardián que enviará un ping de conectividad a mi cliente cada minuto y si el cliente no recibe ningún ping en cinco minutos, intentará reinicializarse.
lo que intenté
Intenté con este script local verificar si puede hacer ping a mi servidor desde mi cliente, pero no funcionó, así que quiero verificar desde el extremo de mi servidor.
#!/bin/bash
test_ping=`ping -c 4 SERVER_ADDR | tail -1| awk '{print $4}' | cut -d '/' -f 2`'>'1000 | bc -l
test_host=`netstat -nr | grep "UG" | awk '{ print $2}' | xargs ping -q -w 1 -c 1 | grep "received" | awk '{ print $4 }'`
if [ "$test_host" == "0" ] || [ -z "$test_host" ] || [ "$test_ping" == "1"] ;
then
echo "restarting network at $(date '+%A %W %Y %X')" >> /path/to/my/logs.file
service networking restart
sleep 60
test_ping=`ping -c 4 SERVER_ADDR | tail -1| awk '{print $4}' | cut -d '/' -f 2`'>'1000 | bc -l
test_host=`netstat -nr | grep "UG" | awk '{ print $2}' | xargs ping -q -w 1 -c 1 | grep "received" | awk '{ print $4 }'`
if [ "$test_host" == "0" ] || [ -z "$test_host" ] || [ "$test_ping" == "1"] ;
then
echo "rebooting at $(date '+%A %W %Y %X')" >> /path/to/my/logs.file
reboot
fi
fi
¿Alguna idea de cómo puedo lograr esto en Linux?
Respuesta1
"Resolví" mi problema creando ssh
un archivo temporal en el cliente
ssh -o ConnectTimeout=5 USER@CLIENT_HOST '/usr/bin/touch /tmp/watchdog.hook'
Esto fue llamado por cron cada minuto en mi servidor usando el siguiente comando cron
* * * * * /path/to/script/watchdog-server.sh
Del lado del cliente intento eliminar el archivo temporal y si falla se incrementará un contador y si es igual a tres reiniciará la red, y si es cinco reiniciará la máquina. Si tiene éxito, restablecerá el contador.
counter_file="/tmp/watchdog.counter"
if [ ! -f "$counter_file" ]; then
printf '0\n' >"$counter_file"
fi
counter_curr=$(< "$counter_file")
rm /tmp/watchdog.hook
if [ $? -eq 0 ]; then
counter_curr=0
else
(( ++counter_curr ))
if [ "$counter_curr" -eq 3 ]; then
echo "No network connection, restarting wlan0 at $(date)"
/sbin/ifdown 'wlan0'
sleep 5
/sbin/ifup --force 'wlan0'
elif [ "$counter_curr" -ge 5 ]; then
echo "No network connection, rebooting machine at $(date)"
/sbin/shutdown -r now
fi
fi
printf '%s\n' "$counter_curr" >"$counter_file"
Queremos esperar 30 segundos antes de ejecutar el script en el cliente, así que agregamos esto al cron:
* * * * * ( sleep 30 ; /path/to/script/watchdog-client.sh )