Sto scrivendo uno script Perl che analizza i file di registro per raccogliere i PID e quindi controlla se quel PID è in esecuzione. Sto cercando di pensare al modo migliore per fare quel controllo. Ovviamente, potrei fare qualcosa del tipo:
system("ps $pid > /dev/null") && print "Not running\n";
Tuttavia, preferirei evitare la chiamata di sistema, se possibile. Ho quindi pensato di poter usare il /proc
filesystem (la portabilità non è un problema, questo funzionerà sempre su un sistema Linux). Per esempio:
if(! -d "/proc/$pid"){
print "Not running\n";
}
È sicuro? Posso sempre supporre che se non esiste una /proc/$pid/
directory il PID associato non è in esecuzione? Mi aspetto così dal momento che AFAIK ps
stesso ottiene /proc
comunque le sue informazioni, ma poiché questo è per il codice di produzione, voglio esserne sicuro.
Quindi, possono esserci casi in cui un processo in esecuzione non ha /proc/PID
directory o in cui /proc/PID
esiste una directory e il processo non è in esecuzione? C'è qualche motivo per preferire l'analisi ps
al controllo dell'esistenza della directory?
kill -0
è il migliore), questo ti dice solo se c'è un processo in esecuzione con il PID dato . Non ti dice se il processo sarà ancora in esecuzione un millisecondo dopo, e non ti dice se il processo è quello a cui sei interessato o un processo non correlato a cui è stato assegnato lo stesso PID dopo l'interruzione del processo interessante . È quasi sempre un errore verificare se un determinato PID è in esecuzione : ci sono pochissime circostanze in cui questo non è soggetto a condizioni di gara.
kill
funzione perl che usa il segnale 0 che non uccide ma dice se puoi farlo (cioè hai bisogno dell'autorizzazione per segnalare quel processo).