Reinicie quando nenhuma conexão de rede não funcionar!

1

Eu tenho um Raspberry Pi que uso como NAS para minha rede local. Funciona bem, mas quando desligo o roteador ao qual o pi está conectado, perde permanentemente a conexão. Para poder se conectar à rede novamente, é necessário reiniciá-lo. Por isso, escrevi este script:

#!/bin/bash

if ! ping -q -w 1 -c 1 $(ip r | grep default | cut -d ' ' -f 3)
then
        service networking restart

        sleep 60

        if ! ping -q -w 1 -c 1 $(ip r | grep default | cut -d ' ' -f 3)
        then
                reboot
        fi
fi

Ele basicamente tenta fazer o ping do roteador. Se falhar, reinicia o serviço de rede (para quando um erro simples ocorreu e uma reinicialização não é necessária). Se ainda não for possível efetuar ping para o roteador, ele será reinicializado. Eu configuro isso como um cronjob a cada 10 minutos, mas não funciona. O que estou fazendo errado?

Eu coloquei esta linha no crontab:

0,10,20,30,40,50 * * * * /root/rebooter.sh >> rebooter.log 2>&1

Sem conexão, esta é a saída:

Usage: ping [-LRUbdfnqrvVaAD] [-c count] [-i interval] [-w deadline]
            [-p pattern] [-s packetsize] [-t ttl] [-I interface]
            [-M pmtudisc-hint] [-m mark] [-S sndbuf]
            [-T tstamp-options] [-Q tos] [hop1 ...] destination
/root/rebooter.sh: Line 5: service: Command not found.
Usage: ping [-LRUbdfnqrvVaAD] [-c count] [-i interval] [-w deadline]
            [-p pattern] [-s packetsize] [-t ttl] [-I interface]
            [-M pmtudisc-hint] [-m mark] [-S sndbuf]
            [-T tstamp-options] [-Q tos] [hop1 ...] destination
/root/rebooter.sh: Line 11: reboot: Command not found.

Com conexão, esta é a saída:

PING 192.168.178.1 (192.168.178.1) 56(84) bytes of data.

--- 192.168.178.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.985/0.985/0.985/0.000 ms
    
por BrainStone 18.08.2014 / 18:30

1 resposta

1

Acho que o problema está na sua declaração if .

if ! ping -q -w 1 -c 1 $(ip r | grep default | cut -d ' ' -f 3)

Mais especificamente:

ping -q -w 1 -c 1 $(ip r | grep default | cut -d ' ' -f 3)

O host ip não é passado corretamente.

Observe que cada parte funciona sozinha (por exemplo, ping host e ip r.... ).

Isso tem funcionado para mim:

$ ip r | grep "default" | cut -d ' ' -3 | xargs ping -q -w 1 -c 1

Tente incorporá-lo com suas instruções if . xargs pega a saída dos canais anteriores e usa-a para ping , enquanto anteriormente o ip não foi passado para a ping metade do código. Experimente na linha de comando :-)

Alterado para netstat em vez de ip r , que também funciona com o Pi, mas é geral o suficiente para ser usado em outras versões do Linux.

O script abaixo:

Ele obtém corretamente o nome do host para ping e insere a (s) instrução (ões) no caso de um 0 (entrada, ou seja, quando o dispositivo está desconectado).

Também reestruturou a instrução if com [] colchetes e atribuiu uma variável para declaração mais clara.

#!/bin/bash

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" ] ;
then
    echo "service networking restart"

    sleep 60
    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" ] ;
    then
            echo "reboot"
    fi
fi
    
por 18.08.2014 / 20:05