L'essenza di esso è:
- È necessario rilevare se il programma è ancora in esecuzione e non appeso.
- È 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:
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.
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.
fonte
2011-09-11 06:07:23
Qualsiasi fuori dai demoni della scatola per guardare demoni e riavviarli haha? – user623879
Su molte piattaforme embedded puoi avere il tuo demone watchdog che produce un watchdog hardware, assicurando che il watchdog non muoia – Hasturkun
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. –