2011-09-11 16 views
5

Possiedo un sistema che esegue Linux incorporato ed è fondamentale che venga eseguito continuamente. Fondamentalmente è un processo per comunicare con i sensori e trasmettere tali dati al database e al client web.Linux riavvia automaticamente l'applicazione in caso di arresto anomalo - Demoni

Se si verifica un arresto anomalo, come si riavvia automaticamente l'applicazione?

Inoltre, ci sono diversi thread che eseguono il polling (es. Socket & comunicazioni uart). Come faccio a garantire che nessuno dei thread si blocchi o si chiuda in modo imprevisto? C'è un watchdog facile da usare che è threading amichevole?

risposta

6

L'essenza di esso è:

  1. È necessario rilevare se il programma è ancora in esecuzione e non appeso.
  2. È necessario (ri) avviare il programma se il programma non è in esecuzione o è bloccato.

ci sono un certo numero di modi diversi per fare # 1, ma due che mi vengono in mente sono:

  1. ascolto su un socket di dominio UNIX, per gestire le richieste di stato. Un'applicazione esterna può quindi chiedere se l'applicazione è ancora ok. Se non riceve risposta entro un certo periodo di timeout, allora si può presumere che l'applicazione richiesta sia bloccata o morta.

  2. Toccare periodicamente un file con un percorso preselezionato. Un'applicazione esterna può visualizzare il timestamp per il file e, se è scaduta, può presumere che l'applicazione sia morta o bloccata.

Rispetto al 2 #, uccidendo il PID precedente e utilizzando fork + exec per avviare un nuovo processo è tipico. Si potrebbe anche considerare di rendere l'applicazione che viene eseguita "continuamente", in un'applicazione che viene eseguita una sola volta, ma poi utilizzare "cron" o un'altra applicazione per rieseguire continuamente l'applicazione a esecuzione singola.

Sfortunatamente, i timer del watchdog e l'uscita dallo stallo sono problemi non banali. Non conosco alcun modo generico per farlo, e le poche che ho visto sono piuttosto brutte e non sono prive di errori al 100%. Tuttavia, tsan può aiutare a rilevare potenziali scenari di deadlock e altri problemi di threading con l'analisi statica.

+0

Qualsiasi fuori dai demoni della scatola per guardare demoni e riavviarli haha? – user623879

+1

Su molte piattaforme embedded puoi avere il tuo demone watchdog che produce un watchdog hardware, assicurando che il watchdog non muoia – Hasturkun

+0

Vorrei aggiungere il suggerimento di "Regolare l'applicazione in modo che venga eseguita solo una volta, quindi riesegui quella singola- eseguire l'applicazione ripetutamente. " Se ciò è possibile, semplificherà in modo significativo il processo di rilevamento. –

6

È possibile riavviare senza problemi il processo mentre muore con fork e waitpid come descritto in this answer. Non costa nessuna risorsa significativa, dal momento che il sistema operativo condividerà le pagine di memoria.

Che lascia solo il problema di rilevare un processo bloccato. È possibile utilizzare una delle soluzioni indicate da Michael Aaron Safyan per questo, ma una soluzione ancora più semplice sarebbe utilizzare ripetutamente il syscall alarm, con il segnale che interrompe il processo (utilizzare di conseguenza la sigaction). Finché continui a chiamare alarm (ad esempio finché il tuo programma è in esecuzione) continuerà a essere in esecuzione. Una volta che non lo fai, il segnale sparerà.
In questo modo, non sono necessari programmi aggiuntivi e vengono utilizzate solo le risorse POSIX portatili.

1

si potrebbe creare un job cron per verificare se il processo è in esecuzione con start-stop-daemon di tanto in tanto.

0

uso questo script per l'esecuzione dell'applicazione

#!/bin/bash 

while ! /path/to/program #This will wait for the program to exit successfully. 
do 
echo “restarting”     # Else it will restart. 
done 

si può anche mettere questo script sul vostro /etc/init.d/ in altri per iniziare come demone

Problemi correlati