Envie o ping de conectividade de rede do servidor para o cliente

1

Então eu tenho um servidor e um computador cliente que eu devo ter rodando na rede o tempo todo. Às vezes, porque estou executando meu computador cliente em WLAN , a rede fica inativa, por isso preciso reiniciá-lo. Porque eu quero garantir que há uma conexão ativa entre o meu servidor e o cliente, eu devo ter alguma maneira de enviar uma verificação regular com o computador cliente se ele estiver essencialmente vivo 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 nenhum desses pacotes do meu servidor, ele reinicializará a rede. máquina linux inteira.

A idéia é fazer com que o meu servidor aja 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 tais pings dentro de cinco minutos, ele tentará se reinicializar.

O que eu tentei

Eu tentei com este script local verificar se ele pode fazer ping no meu servidor do meu cliente, mas não estava funcionando, por isso, quero verificar a partir do meu servidor, em vez disso.

#!/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 eu posso realizar isso no Linux?

    
por Linus 04.11.2015 / 23:33

1 resposta

0

Eu "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

No lado do cliente, tento excluir o arquivo temporário e, se ele falhar, um contador será incrementado e, se for igual a três, ele reiniciará a rede e, se ele for cinco, reinicializará a máquina. Se tiver sucesso, redefinirá o 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 executar o script no cliente, então adicionamos isso ao cron:

*   * * *   * ( sleep 30 ; /path/to/script/watchdog-client.sh )
    
por 12.11.2015 / 13:50