Linux: scrivere un watchdog per monitorare più processi


14

Qualche anno fa, un collega trovò una soluzione elegante per un programma di sorveglianza. Il programma è stato eseguito su Windows e ha utilizzato oggetti Evento Windows per monitorare gli handle di processo (PID) di diverse applicazioni. Se uno qualsiasi dei processi terminasse in modo imprevisto, il suo handle di processo non esisterebbe più e il suo cane da guardia verrebbe immediatamente segnalato. Il cane da guardia avrebbe quindi adottato le misure appropriate per "curare" il sistema.

La mia domanda è: come implementeresti un simile cane da guardia su Linux? Esiste un modo per un singolo programma di monitorare i PID di molti altri?


Vedere anche Assicurarsi che sia sempre in esecuzione un processo per un elenco di programmi di monitoraggio / supervisione.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


17

Il modo tradizionale, portatile e comunemente usato è che il processo genitore veglia sui suoi figli.

Le primitive di base sono le chiamate di sistema waitewaitpid . Quando un processo figlio muore, il processo genitore riceve un SIGCHLDsegnale, indicando che dovrebbe chiamare waitper sapere quale bambino è morto e il suo stato di uscita. Il processo padre può invece scegliere di ignorare SIGCHLDe chiamare waitpid(-1, &status, WNOHANG)a proprio piacimento.

Per monitorare molti processi, potresti generarli tutti dallo stesso genitore, oppure invocarli tutti attraverso un semplice processo di monitoraggio che chiama semplicemente il programma desiderato, attende che termini e segnala il termine (nella sintassi della shell:) myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe. Se provieni dal mondo Windows, nota che avere piccoli programmi che svolgono un'attività specializzata è un progetto comune nel mondo Unix, il sistema operativo è progettato per rendere i processi economici.

Esistono molti programmi di monitoraggio dei processi (chiamati anche supervisore) che possono segnalare quando un processo si interrompe e, facoltativamente, riavviarlo e molto altro ancora: Monit , Supervise , Upstart , ...


+1, esattamente quello che stavo cercando - grazie per una risposta così dettagliata.
Justin Ethier,

0

Il mio approccio a questo problema è utilizzare init e la sua direttiva respawn integrata per avviare / riavviare tutto ciò che è necessario eseguire. Questo era il suo intento originale e lo scopo principale. In alcuni casi sarà necessario eseguire uno script per ripulire dopo la fine di un processo o per preparare l'avvio del processo (il più delle volte il lavoro è lo stesso). Nella maggior parte dei casi uno script bash che termina in exec funziona alla grande per questo.

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.