Questo può essere difficile, perché puoi avere istanze separate dello stesso processo che vivono in modo indipendente. Ad esempio, server in ascolto su porte diverse o servizi in esecuzione come utenti diversi. Per distinguere tra queste istanze, è necessario assegnare a ciascuna di esse un tag univoco. Il tag è spesso un file, ma può essere un socket locale nello spazio dei nomi astratto, una porta TCP, ecc. - Qualsiasi identificatore univoco lo farà. Quando il tag è un file, può essere un normale file contenente un ID processo (un pidfile) o una pipe o socket con nome su cui il file è in ascolto, ecc. Idealmente, il tag è un endpoint di comunicazione che consente ai client di connettersi a quel processo.
Ognuno di questi diversi tipi di tag comporta un modo diverso di verificare se l'istanza che stai cercando è attiva e funzionante. Ad esempio, con un socket di file locale, provare a connettersi ad esso e avviare il processo se non esiste alcun processo in ascolto su quel socket. Se il tag è un file pid, controlla se esiste un processo con quell'ID processo, ma fai attenzione che sia fragile, poiché se il processo è morto, potrebbe esserci un processo non correlato che ha riutilizzato il suo ID. Attenzione che se due client tentano di raggiungere il processo in un breve lasso di tempo, entrambi potrebbero scoprire che il processo non esiste ed entrambi tentano di avviarlo; proteggere adeguatamente da questa condizione di gara può essere complicato.
È più semplice gestire le istanze quando sono tutte avviate dallo stesso processo di supervisione e quel processo di supervisione rileva quando le istanze muoiono e reagisce di conseguenza. Molti programmi di monitoraggio del servizio che possono farlo.
Se il programma non risponde su un endpoint di comunicazione noto e non è gestito da un programma di supervisione, il tag del povero è un pidfile: un file contenente l'ID del processo. Quando si avvia il processo, scrivere il pid in un file con un nome predefinito. Quando è necessario che il processo esista, leggere il file pid e vedere se esiste un processo con quel pid. Quando si termina il processo, cancellare il file pid. Il problema più saliente con un pidfile non supervisionato è che se il processo muore, il suo pid può essere riutilizzato da un processo non correlato. Dovresti almeno controllare il nome del processo o l'eseguibile del processo per assicurarti di parlare con il processo giusto. Molte varianti di unix hanno un comando pgrep :pgrep SOMENAME
elenca i processi il cui nome contiene SOMENAME come sottostringa, con opzioni aggiuntive da limitare a un determinato utente, per richiedere una corrispondenza esatta, per cambiare quale delle diverse possibili nozioni di "nome processo" viene utilizzata, ecc.
ps -ef | grep -v grep | grep "process_name" || run_command_here