Portanto, tenho um servidor e um computador cliente que devo ter em execução na rede o tempo todo. Às vezes, porque estou executando meu computador cliente na WLAN
rede, ele fica inativo e preciso reiniciá-lo. Como quero garantir que haja uma conexão ativa entre meu servidor e o cliente, preciso de alguma forma enviar uma verificação regular ao computador cliente se ele estiver essencialmente ativo ou responsivo.
Meu problema
Eu preciso primeiro reiniciar a rede se o cliente não receber nenhum ping de conectividade do meu servidor dentro de cinco minutos e se a rede tiver reiniciado e ainda não receber esses pacotes do meu servidor, ele irá reinicializar toda a máquina Linux .
A idéia é fazer com que meu servidor atue como um cão de guarda que enviará um ping de conectividade ao meu cliente a cada minuto e se o cliente não receber nenhum desses pings em cinco minutos, ele tentará se reinicializar.
O que eu tentei
Tentei com este script local para verificar se ele consegue executar ping no meu servidor a partir do meu cliente, mas não estava funcionando, então quero verificar no final do meu 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
Alguma idéia de como posso fazer isso no Linux?
Responder1
"Resolvi" meu problema usando ssh
para criar um arquivo temporário no cliente
ssh -o ConnectTimeout=5 USER@CLIENT_HOST '/usr/bin/touch /tmp/watchdog.hook'
Isso foi chamado pelo cron a cada minuto no meu servidor usando o comando cron abaixo
* * * * * /path/to/script/watchdog-server.sh
Do lado do cliente tento deletar o arquivo temporário e se falhar um contador será incrementado e se for igual a três reinicia a rede, e se for cinco reinicia a máquina. Se tiver sucesso, o contador será zerado.
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 executar o script no cliente, então adicionamos isto ao cron:
* * * * * ( sleep 30 ; /path/to/script/watchdog-client.sh )