Raspberry Pi: Keep Me Alive!

| |

Hai presente quando vuoi fare in modo che – nel caso in cui ci siano dei problemi temporanei e non gravi di rete dal Raspberry Pi verso il mondo esterno (che vuol dire anche banalmente la raggiungibilità del router di casa) – il tuo giocattolo possa autonomamente provare a tornare raggiungibile senza il tuo intervento? Ecco, quello.

Keep Me Alive è il nome che ho dato a uno script di Bash che prende una base di partenza già ben scritta, la modifica secondo esigenza e fa in maniera tale da provare a far resuscitare la connettività del Raspberry Pi nel caso in cui questa venga a meno per qualsivoglia motivo (che poi potrai indagare subito dopo essere tornato disponibile alla connessione SSH).

KeepMeAlive.sh

La base di cui ti parlavo poco fa è quella di Dominic e l’ho trovata nel forum ufficiale della comunità RPi.
Quello di cui avevo bisogno io, contrariamente a lui, è di verificare che fosse connessa la porta di rete fisica, non la scheda WiFi. Per questo motivo ho leggermente ritoccato lo script e – per non farmi mancare nulla – ho anche cambiato il nome dei file prodotti (e relativa directory) e aggiunto un controllo che invia un’email nel caso in cui sia stato necessario riavviare l’intero sistema.

Ti mostro prima lo script, poi ti riporto alcune indicazioni:

#!/bin/bash
# This runs in Crontab to check that the eth0 is working.  If it is faulty it will
# firstly restart eth0 and check all is running well.  If not, the script will reboot the PI
# Any checks and reboots are stored as actions in txt files in /home/pi/Scripts
# Credits: Dominic 29/1/2020
# Mod: Gioxx 12/5/2022

# Check KMA_reboot and alert admin
rebootcheck=/home/pi/KMA/KMA_reboot.txt
if test -f "$rebootcheck"; then
    value=$(<"$rebootcheck")
    echo "RPi3-KMA: $value." | mail -s "RPi3-KMA alert: reboot found" user@contoso.com
    rm /home/pi/KMA/KMA_reboot.txt
fi

# Lines below are to get the date and time variables ready
BASHDATE=`date +"%b %d, %Y"`
BASHTIME=`date +" %T"`
DESTINATION="www.google.com"
# Start of code
ping -c1 ${DESTINATION} > /dev/null
if [ $? != 0 ]
then
#	eth0 is down so going into the next phase of this file to check, reset and reboot too if necessary
    echo eth0 all bad, restarting it on ${BASHDATE} at: ${BASHTIME} > /home/pi/KMA/KMA_bad.txt
    sudo ifconfig eth0 down
    sleep 5
#	Restarting eth0 if needed
    sudo ifconfig eth0 up
    sleep 18
    sleep 2
#	Re-pinging after eth0 re-start
    ping -c1 ${DESTINATION} > /dev/null
#	If Ping fails the PI will restart
    if [ $? != 0 ]
    then
        echo eth0 all bad, restarting the PI on ${BASHDATE} at: ${BASHTIME} > /home/pi/KMA/KMA_reboot.txt
        sleep 5
        sudo reboot
    fi

else
# If all is good this is written to a text file.
    echo eth0 all good on ${BASHDATE} at: ${BASHTIME} > /home/pi/KMA/KMA_good.txt
    echo eth0 all good on ${BASHDATE} at: ${BASHTIME}
fi

Cosa devi sapere:

  • Lo script – nel mio caso – risiede nella cartella /home/pi/KMA. Se decidi di cambiare cartella, è bene che tu vada a cambiare ogni riferimento a essa nello script sopra riportato, per evitare di incorrere in errori vari per cartelle non esistenti o semplicemente di non capire dove lo script sta salvando i suoi output.
  • user@contoso.com andrà modificato con un tuo indirizzo di posta elettronica, ammesso tu voglia ricevere notifiche riguardo il riavvio di sistema del Raspberry Pi in seguito al tentativo (KO) di riavviare solo la porta di rete. Occhio però, questo check si basa sul fatto che il tuo Raspberry Pi possieda una configurazione corretta per inviare email tramite SMTP. Il mio lo fa tramite un server di posta esterno. Se il tuo non dovesse farlo, ti conviene configurarlo ad-hoc o – semplicemente – potrai commentare queste due righe:
echo "RPi3-KMA: $value." | mail -s "RPi3-KMA alert: reboot found" user@contoso.com
rm /home/pi/KMA/KMA_reboot.txt

Così facendo potrai sempre controllare manualmente se il RPi si è riavviato a causa di problemi di rete, basterà che ti assicuri dell’esistenza del file KMA_reboot.txt nella stessa cartella dello script bash.

  • Lo script punta a risolvere l’indirizzo www.google.com. Se questo dovesse fallire, allora verrà dapprima disattivata la porta di rete (eth0), partirà un conto alla rovescia di 5 secondi, verrà riattivata la porta di rete e – dopo un’attesa di altri 20 secondi – verrà effettuato un altro tentativo di risoluzione del nome a dominio. Se questo dovesse fallire ancora, allora lo script riavvierà l’intero sistema operativo del RPi.
  • Ogni operazione genererà un messaggio che verrà salvato in file di log ad-hoc. Se tutto funziona correttamente (ogni volta che eseguirai lo script) verrà prodotto il file KMA_good.txt con all’interno data e ora del controllo andato a buon fine.
    Se la prima risoluzione nome dovesse fallire, verrà prodotto il file KMA_bad.txt (anche in questo caso troverai data e ora dell’accaduto all’interno del file).
    Se la seconda risoluzione nome dovesse fallire, verrà prodotto il file KMA_reboot.txt (e valgono ancora una volta le stesse regole contenute tra le parentesi tonde dell’affermazione precedente).

È logico e va da sé che puoi ritoccare lo script come meglio credi per operare anche sulla scheda WiFi ammesso sia questa quella utilizzata dal tuo RPi. Io ho preferito connetterlo a rete cablata per maggiore stabilità ma capisco che altri potrebbero non essere nella stessa – indiscutibilmente comoda – situazione.

Programma il controllo

Fatti dare una mano da Crontab e decidi tu quando eseguire questo controllo. Non esagererei con troppe esecuzioni a tappeto ravvicinate tra di loro, usa sempre crontab.guru se non sai tradurre la programmazione in qualcosa di comprensibile per Crontab. Vuoi un esempio? Io lo faccio girare ogni due ore:

0 */2 * * * /home/pi/KMA/KeepMeAlive.sh

Se hai domande o idee, se pensi che ci sia qualcosa di migliorabile all’interno del codice o se vuoi riscriverlo da zero e proporre la tua versione beh, sentiti libero di commentare l’articolo! 🍻

#StaySafe

Correzioni, suggerimenti? Lascia un commento nell'apposita area qui di seguito o contattami privatamente.
Ti è piaciuto l'articolo? Offrimi un caffè! ☕ :-)

L'articolo potrebbe non essere aggiornato

Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio ti invito a lasciare un commento per chiedere ulteriori informazioni! :-)

Condividi l'articolo con i tuoi contatti:
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Commenti
Inline Feedbacks
View all comments