Riavvia automaticamente, se non hai una connessione wifi per un certo tempo


13

Sembra che il mio server Raspberry Pi perda una connessione wifi dopo un tempo casuale e non riesca in qualche modo a ripristinarsi automaticamente.

Di solito un riavvio fatto a mano risolve il problema.

Vorrei riavviarlo automaticamente se non c'è wifi dopo circa 30 minuti. Come posso fare ciò?


5
Hai provato a togliere l'interfaccia e ripristinarla? Che ne dici di scaricare e ricaricare il modulo del kernel per la tua scheda wireless? Potrebbe esserci qualcos'altro che puoi fare per ripristinare la scheda senza riavviare.
hololeap,

1
sì, probabilmente funzionerebbe anche questo, ma il problema principale qui è come rilevarlo automaticamente e quindi eseguire l'azione appropriata.
morsetto

Risposte:


10

Questa è essenzialmente la risposta di Warwick, solo con istruzioni dettagliate.


  1. Creare il seguente script di shell nella cartella principale:

    check_inet.sh

    #!/bin/bash
    
    TMP_FILE=/tmp/inet_up
    
    # Edit this function if you want to do something besides reboot
    no_inet_action() {
        shutdown -r +1 'No internet.'
    }
    
    if ping -c5 google.com; then
        echo 1 > $TMP_FILE
    else
        [[ `cat $TMP_FILE` == 0 ]] && no_inet_action || echo 0 > $TMP_FILE
    fi
    
  2. Modifica le autorizzazioni in modo che sia eseguibile

    $ chmod +x check_inet.sh
    
  3. Modifica /etc/crontabutilizzando sudoe aggiungi la seguente riga (sostituisci yournamecon il tuo nome utente effettivo):

    */30 * * * * /home/yourname/check_inet.sh
    

5

Un modo sarebbe quello di inserire una voce nel cron di root che esegue uno script ogni 30 minuti. Lo script testerebbe la connessione WIFI, magari usando ping, e scriverà il risultato in un file in / tmp - 1 per la connessione esiste, 0 se non lo fa. Le successive iterazioni dello script controllerebbero quindi quel file e, se fosse 0, e la connessione WIFI fosse ancora errata, eseguire un init 6comando.


3

Penso che la soluzione hololeap stia funzionando.

La mia soluzione controlla ogni N minuti (a seconda di come configuri il tuo crontab) per una connessione di rete funzionante. Se il controllo fallisce, tengo traccia dell'errore. Quando il conteggio dei guasti è> 5 Provo a riavviare il wifi (puoi anche riavviare Raspberry se il riavvio del wifi fallisce, controlla i commenti).

Ecco un repository GitHub contenente sempre l'ultima versione dello script: https://github.com/ltpitt/bash-network-repair-automation

Ecco, secondo la politica generale di stackexchange (tutte le risposte non devono contenere solo collegamenti), anche il file network_check.sh, copia e incolla in qualsiasi cartella ti piace, le istruzioni di installazione sono nei commenti dello script.

#!/bin/bash
# Author:
# twitter.com/pitto
#
# HOW TO INSTALL:
#
# 1) Install ifupdown and fping with the following command:
# sudo apt-get install ifupdown fping
#
# 2) Then install this script into a folder and add to your crontab -e this row:
# */5 * * * * /yourhome/yourname/network_check.sh
#
# Note:
# If you want to perform automatic repair fsck at reboot
# remember to uncomment fsck autorepair here: nano /etc/default/rcS

# Let's clear the screen
clear

# Write here the gateway you want to check to declare network working or not
gateway_ip='www.google.com'

# Here we initialize the check counter to zero
network_check_tries=0

# Here we specify the maximum number of failed checks
network_check_threshold=5

# This function will be called when network_check_tries is equal or greather than network_check_threshold
function restart_wlan0 {
    # If network test failed more than $network_check_threshold
    echo "Network was not working for the previous $network_check_tries checks."
    # We restart wlan0
    echo "Restarting wlan0"
    /sbin/ifdown 'wlan0'
    sleep 5
    /sbin/ifup --force 'wlan0'
    sleep 60
    # If network is still down after recovery and you want to force a reboot simply uncomment following 4 rows
    #host_status=$(fping $gateway_ip)
    #if [[ $host_status != *"alive"* ]]; then
    #    reboot
    #fi
}

# This loop will run network_check_tries times and if we have network_check_threshold failures
# we declare network as not working and we restart wlan0
while [ $network_check_tries -lt $network_check_threshold ]; do
    # We check if ping to gateway is working and perform the ok / ko actions
    host_status=$(fping $gateway_ip)
    # Increase network_check_tries by 1 unit
    network_check_tries=$[$network_check_tries+1]
    # If network is working
    if [[ $host_status == *"alive"* ]]; then
        # We print positive feedback and quit
        echo "Network is working correctly" && exit 0
    else
        # If network is down print negative feedback and continue
        echo "Network is down, failed check number $network_check_tries of $network_check_threshold"
    fi
    # If we hit the threshold we restart wlan0
    if [ $network_check_tries -ge $network_check_threshold ]; then
        restart_wlan0
    fi
    # Let's wait a bit between every check
    sleep 5 # Increase this value if you prefer longer time delta between checks
done

modifica 26/01/2018: ho rimosso i file temporanei per consentire l'esecuzione dello script in memoria ed evitare di scrivere sulla scheda SD di Raspberry.


1
Questo script evita il riavvio in disconnessioni temporanee. Eccellente grazie!
wezzix,

1
Sembra che tu abbia apportato un grande cambiamento a questo script. A quanto ho capito, la versione precedente avrebbe fatto un passaggio, facendo cose (incluso l'aggiornamento dei file tmp) e uscendo. Non conteneva alcun loop; piuttosto, dipendeva da cron per eseguirlo ogni cinque minuti. Se la rete fosse inattiva per cinque controlli consecutivi (vale a dire, per un arco di circa mezz'ora), lo script farebbe le cose per provare a ripristinare la rete. Questa sembra essere una buona risposta alla domanda, sebbene il fatto che abbia scritto su file tmp sia stato un po 'un inconveniente. ... (proseguendo)
Scott,

(Proseguendo) ... La nuova versione contiene un loop e controlla la rete ogni cinque secondi . Se la rete è inattiva per cinque controlli consecutivi (ad es. Per circa mezzo minuto ), lo script fa le cose per provare a ripristinare la rete. (Questo sembra essere diverso da quello che la domanda richiede.) E qui diventa un po 'strano. Dopo aver rilevato un errore di rete di cinque volte consecutive e ripristinato la rete, lo script viene chiuso. (E, per inciso, esce senza mai controllare se la rete è effettivamente risalita.) ... (proseguendo)
Scott

(Proseguendo) ... Ma fino a quando la rete è attiva , lo script continua a funzionare per sempre, in attesa che la rete fallisca. Nel frattempo, cron continua a riavviare lo script ogni cinque minuti. Se la rete rimane attiva per un'ora, saranno in esecuzione una dozzina di copie dello script. E, se la rete fallisce , quelle dozzine di processi combatteranno tra loro, facendo in modo asincrono ifdowne ifup, forse, riparando la rete, e forse no. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... Se ho frainteso qualcosa, per favore spiegamelo. ... (proseguendo)
Scott,

(Proseguendo) ... (1) Se stai per fare una riprogettazione così importante di una risposta che è stata pubblicata per oltre un anno, dovresti dire quello che hai fatto. "Ho rimosso i file temporanei per consentire l'esecuzione dello script in memoria" non è una descrizione adeguata delle modifiche. (2) Sembra che tu abbia una collezione di pioli quadrati, pioli rotondi, fori quadrati e fori rotondi e non li hai abbinati correttamente. È necessario modificare lo script per uscire quando rileva che la rete è attiva oppure modificarlo per essere eseguito per sempre e modificare il crontab per avviare lo script una sola volta (ovvero, all'avvio).
Scott,

0

Ho modificato la sceneggiatura di Pitto per il mio gateway multitech mtac loraWAN (senza fping). Ho anche aggiunto un file di registro.

#!/bin/bash
# Author: 
# twitter.com/pitto
#
# HOW TO INSTALL:
#
# 1) Install ifupdown with the following command:
# sudo apt-get install ifupdown
#
# 2) Create files in any folder you like (ensure that the filename variables, set below,
# match the names of the files you created) with the following commands:
# sudo touch /home/root/scripts/network_check_tries.txt &&
#                               sudo chmod 777 /home/root/network_check_tries.txt
# sudo touch /home/root/scripts/N_reboots_file.txt      &&
#                               sudo chmod 777 /home/root/N_reboots_file.txt
# sudo touch /home/root/scripts/network_check.log       &&
#                               sudo chmod 777 /home/root/network_check.log
#
# 3) Then install this script into a folder and add to your crontab -e this row:
# */5 * * * * /yourhome/yourname/network_check.sh
#
# Note:
# If additionally you want to perform automatic repair fsck at reboot
# remember to uncomment fsck autorepair here: nano /etc/default/rcS

# Specify the paths of the text file where the network failures count, reboot count,
# and log will be held:
network_check_tries_file='/home/root/network_check_tries.txt'
N_reboots_file='/home/root/N_reboots_file.txt'
log_file='/home/root/network_check.log'

# Save file contents into corresponding variables:
network_check_tries=$(cat "$network_check_tries_file")
N_reboots=$(cat "$N_reboots_file")


# If host is / is not alive we perform the ok / ko actions that simply involve
# increasing or resetting the failure counter
ping -c1 google.com
if [ $? -eq 0 ]
then
    # if you want to log when there is no problem also,
    # uncomment the following line, starting at "date".
    echo 0 > "$network_check_tries_file" #&& date >> "$log_file" && echo -e "-- Network is working correctly -- \n" >> "$log_file"
else
    date >> "$log_file" && echo -e "-- Network is down... -- \n" >> "$log_file" && echo "$(($network_check_tries + 1))" > "$network_check_tries_file"
fi

# If network test failed more than 5 times (you can change this value to whatever you
# prefer)
if [ "$network_check_tries" -gt 5 ] 
then
    # Time to restart ppp0
    date >> "$log_file" && echo "Network was not working for the previous $network_check_tries checks." >> "$log_file" && echo "Restarting ppp0" >> "$log_file"
    killall pppd
    sleep 20
    /usr/sbin/pppd call gsm
    sleep 120
    # Then we check again if restarting wlan0 fixed the issue;
    # if not we reboot as last resort
    ping -c1 google.com
    if [ $? -eq 0 ]
    then
        date >> "$log_file" && echo -e "-- Network is working correctly -- \n" >> "$log_file" && echo 0 > "$network_check_tries_file"
    else
        date >> "$log_file" && echo -e  "-- Network still down after ifdownup... reboot time!-- \n" >> "$log_file" && echo 0 > "$network_check_tries_file" && echo "$(($N_reboots + 1))" > "$N_reboots_file" && reboot
    fi
fi

(1) Perché parli ancora ifupdownse non lo usi? (2) Perché sei passato gateway_ipda una variabile a una costante codificata?
Scott,

ciao scott, ho dimenticato di cancellare i commenti ifdown ifup. Ho dimenticato di cambiare gatewy_ip hardcoded.
user3036425,

Bello! Ho aggiunto una nuova versione che non utilizza i file temporanei (scrivere su SD di Raspberry non è stata una grande idea), puoi verificarlo nella mia risposta.
Pitto,

Questo script eredita un paio di problemi presenti nella versione originale dello script di Pitto (che sono stati successivamente corretti): (1) Se la rete non funziona a partire dalle 00:00:01 (un secondo dopo la mezzanotte), lo script non verrà reagisce fino alle 00:35 (ovvero, 35 minuti dopo, al settimo controllo), perché, anche se aumenta il valore nel network_check_tries_filefile (quando pingfallisce), non incrementa la network_check_triesvariabile. ... (proseguendo)
Scott,

(Proseguendo) ... Quindi lo script viene eseguito sette volte (alle 00:05, 00:10, 00:15, 00:20, 00:25, 00:30 e 00:35) con network_check_triesuguale a 0, 1, 2, 3, 4, 5 e 6 - ed è solo sulla settima chiamata (con network_check_triesuguale a 6) che il if [ "$network_check_tries" -gt 5 ]test ha successo. Probabilmente, questo è il comportamento corretto. Per quanto ne sa lo script, la rete potrebbe essere caduta alle 00:04:59, quindi ci vogliono sette errori consecutivi per essere sicuri di aver coperto un periodo di 30 minuti. … (Proseguendo)
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.