Domanda”
Di tanto in tanto si blocca l'Rpi in remoto. Come svegliarli?
Risposta
Aggiorna 2019jul27hkt1406
Recentemente ho aggiornato il mio Rpi3B + stretch a Rpi4B buster e di nuovo ho seguito il tutorial di @ berto per impostare il timer del watch dog. Ho scoperto che tutto funziona perfettamente come prima. In altre parole, non è necessario apportare modifiche al tutorial di @ berto quando si aggiorna a Rpi4.
L'ultima volta non sapevo nulla della cosa del timer watchdog. Quindi mi ci sono volute più di 3 ore per google per capire tutto dentro e fuori (beh, quasi dentro e fuori). Questa volta so cosa sta succedendo e tutti i trucchi di Linux, quindi mi ci sono voluti solo un paio di minuti per completare il tutorial di @ berto.
2019jun18 Aggiornamenti
Dopo altri pensieri, ho concluso che la mia risposta sta volgendo al termine. La mia conclusione è che il tutorial del cane da guardia di @ berto e il suggerimento per l'esperimento sono buoni e la sua risposta è la vera risposta alla domanda dell'OP.
Ho svolto con successo il suo esperimento suggerito, risultati verificati dal programma forkbomb e dopo aver cercato su Google e letto per più di 10 ore, penso di aver finalmente capito a fondo l'idea del timer watchdog.
In precedenza pensavo erroneamente di dover ancora imparare a impostare il timer su 10 secondi o più. Ma come dice @berto, 10 secondi è tutto ciò che deve essere impostato. Ho anche letto che posso impostare il timer fino a 16 secondi e l'impostazione predefinita del watchdog di Linux è anche di un minuto. Ma questo non è critico.
Ho rimosso tutte le lunghe note di lettura nelle appendici, per rendere la risposta più breve. Suggerirei ai neofiti di non cercare di capire tutti i dettagli di watchdog, per non parlare del demone SystemD, molto più complicato, perché la nostra vita è breve e quelle cose di sistema sono troppo complicate per i non professionisti.
I vorrei aggiungere due punti per concludere la mia risposta.
(1) Ci sono molte ragioni per cui un Rpi si blocca in un paio di giorni (ma di solito non in mesi). Spesso non è colpa del programma applicativo, ma a causa dei driver o delle funzioni di libreria che creano troppa spazzatura, ad es. prese create, utilizzate ma non adeguatamente smaltite. Se è il programma applicativo stesso a creare garbage, il programma può eseguire la "garbage collection" e risolvere il problema. Ma è difficile rimuovere i garbage socket che non vengono generati dal programma applicativo. Quindi un timer watchdog è utile qui.
(2) Altri modi per evitare troppa spazzatura che utilizza le risorse includono il riavvio di tanto in tanto da software o hardware. Penso che riavviare ogni mattina e utilizzare anche un alimentatore commutabile tramite software per ripristinare il sistema aggiunga un altro livello di protezione. E l'utilizzo di un solo Rpi non è molto sicuro. Usando due Rpi come watchdog l'uno dell'altro (usando URT per il passaggio dei messaggi, ad esempio) aggiungi un ulteriore livello di protezione. Un altro metodo che non ho esplorato è l'utilizzo delle prese Wifi ESP8266. Spero di poterlo provare più tardi.
Questa è la fine della mia risposta. Ciao.
Aggiornamenti 2019jun17
Così ho provato la bomba a forcella. Il sistema si è riavviato dopo aver eseguito il programma, in circa 15 secondi .
Aggiornamenti 2019jun16
Ho scoperto che il programma fork bomb di @ berto è un po 'spaventoso per i principianti. Quindi sto imparando Bash a scoprire cosa sta facendo quella bomba a forcella. Fondamentalmente è solo una funzione chiamata ":", che è definita come una funzione che si chiama due volte, quindi biforcandosi indefinitamente, alla stessa velocità con cui i conigli crescono in modo esponenziale, consumando tutte le risorse e mandando in crash Linux.
Ho anche trovato la seguente versione interessante di forkbomb che utilizza simboli Unicode:
() {| &};
2019giugno 14/15 Aggiornamenti
@thesnow suggerisce un approccio a strati molto carino utilizzando una presa intelligente. Penso che la presa intelligente o le cose intelligenti dell'IoT siano la strada da percorrere. Tuttavia, non sono un principiante così intelligente in roba intelligente, anche se ho voglia di imparare. Quindi comprerò una presa intelligente, farò qualche ricerca e migliorerò la mia risposta in seguito. Per ora, ho aggiunto alcune risorse di apprendimento correlate nella sezione di riferimento di seguito.
Ho trovato molto buono anche il suggerimento di @ berto di utilizzare il timer watchdog hardware di Rpi. Non ho mai giocato con nessuna roba da watchdoog. Quindi lo proverò ora. Le istruzioni di @ berto sono molto dettagliate, ma ancora un po 'difficili per me, perché non conosco molto bene il significato dei comandi "grep" e "dmseg". Quindi ho cercato su Google e ho preso alcune note di lettura nelle appendici seguenti. Poi ho seguito il suggerimento di @ berto e ho faticato un po 'per completare la parte 1. Non ho ancora riavviato, perché ho bisogno di fare una pausa per digerire le cose. Ad ogni modo, ecco la cattura della schermata.
Ho riavviato e ho ottenuto il seguente dmesg:
Penso di andare troppo veloce e ora ho bisogno di prendermi una pausa per studiare prima altre cose su Linux, come systemd, prima di tornare a portare avanti il test su watchdog.
/ per continuare, ...
La risposta
Ho lo stesso problema. Sto costruendo un giardino sul tetto con un paio di Rpi ciascuno dei quali si collega a vari sensori, relè e solenoidi wireless (BlueTooth, Wifi). Ci sono due enormi motori nelle vicinanze, che controllano grandi serbatoi d'acqua e ascensori. I motori generano EMI e di tanto in tanto congelano le cose elettroniche vicine.
Il mio piano è di utilizzare PSU (unità di alimentazione) commutabili tramite software per spegnere / accendere Rpi congelati e altri dispositivi (i dispositivi Bluetooth si bloccano più spesso. BlueTooth e altri piccoli dispositivi non hanno alcun comando di ripristino software o ripristino hardware pin, quindi spegnere / accendere il loro Vcc 5V è un movimento veloce e sporco, ma comunque sicuro). In breve, gli Rpi si guardano regolarmente l'un l'altro ei loro dispositivi e POR (Power On Reset) ogni ragazzo che si è addormentato.
Ovviamente posso anche usare un pin GPIO per attivare il pin di reset dell'hardware Rpi a bordo. Ma sono troppo pigro per eseguire cablaggi extra e un hobbista troppo povero per permettermi dispositivi di sistema non stop di livello professionale / industriale come il timer Dual WatchDog di SwitchDoc Labs (vedi riferimento sotto)
Modifico DC- Alimentatori CC (da 12V a 5V) in modo che qualsiasi pin GPIO Rpi o MCP23x17 possa accendere / spegnere il chip regolatore di tensione LM2956 / LM2947 dell'alimentatore. (LM2941 può essere utilizzato per interruttori di corrente 1A, LM2596 per PSU 5V 3A. Il pin on / off è anche collegato a un pulsante, per test di accensione / spegnimento manuale.)
In realtà ciascuno dei miei 7 L'Rpi3B + è collegato a un modulo orologio in tempo reale DS3231 a buon mercato che ha un pin di interruzione hardware per ripristinare PSU, Rpi o altri dispositivi.
Quando possibile e pratico lego insieme tutti i pin di reset dei dispositivi (rimuovendo alcune delle resistenze di pull up, in modo da non sovraccaricare il pin GPIO).
Ora il DS3231 esterno RTC sveglia tutti la mattina e spegne le luci a mezzanotte, così tutti vanno a letto.
Riferimenti”
1. PSU / interruttori di corrente ripristinabili con software basati su LM2596 / LM2941 - Discussione Rpi StkEx
Discussione watchdog hardware Rpi
SwitchDoc Labs Dual WatchDog Timer
ATXRaspi R3 - LowPowerLab US $ 14,95
Un ESP8266 hackerabile all'interno di una presa intelligente Vuoi giocare con ESP8266 senza preoccuparti l'hardware? - Mat 2017ag06
Reverse Engineering 101 dell'ecosistema Xiaomi IoT HITCON Community 2018 - Dennis Giese
Presa WiFi Xiaomi + app MiHome 21.307 visualizzazioni
espHome [ESP8266 / ESP32]
AliExpress WiFi Smart Plug
Dispositivo intelligente -Wikipedia
Apriporta per garage WiFi con ESP8266 - Ray Wang 2016 maggio13 56.335 visualizzazioni
Appendici
Appendice A - Note sulla lettura del timer WatchDog
Timer Watchdog -Wikipedia
Linux WatchDog Man Page
Linux Watchdog - Test generali
Appendice B - Comandi Linux grep e dmesg note di lettura
Appendice C - riferimenti a systemd
Systemd System and Service Manager - FreeDeskTop
systemd - Wikipedia
Appendice D - Riferimenti a Fork e Fork Bomb
Fork (chiamata di sistema) Wikipedia
Appendice E - Note di apprendimento Bash