Soluzione 1:
in termini semplici, no :un processo (ad esempio un demone) può bloccarsi e non avere il tempo di cancellare il suo file .pid.
Una tecnica per essere più certi dello stato di un programma:utilizzare un canale di comunicazione esplicito come un socket. Scrivi la porta del socket in un file e ottieni il supervisor
processo cercalo.
Puoi anche utilizzare i servizi di DBus su Linux:registra un nome specifico e chiedi al tuo processo supervisore (come lo chiami tu) di controllare quel nome.
Esistono numerose tecniche.
Una cosa da ricordare:non è responsabilità del sistema operativo gestire i file PID.
Soluzione 2:
Jldupont ha ragione nell'affermare che i file .pid non sono affidabili per determinare se un processo è in esecuzione poiché il file potrebbe non essere rimosso in caso di arresto anomalo.
Condizioni di gara a parte, uso spesso pgrep quando ho bisogno di sapere se un processo è in esecuzione. Potrei quindi incrociare l'output con i file .pid se lo ritenessi necessario.
Soluzione 3:
Un file contenente un ID di processo non è affidabile per determinare se un processo è in esecuzione o meno. È solo una fonte affidabile, per capire l'ultimo ID di processo dato per il processo.
Quando hai l'id del processo, devi fare ulteriori controlli, se il processo è realmente in esecuzione.
Ecco un esempio:
#!/usr/bin/env sh
file="/var/run/sshd.pid"
processid=$(cat /var/run/sshd.pid)
if [ ! -f ${file} ]; then
echo "File does not exists: ${file}"
exit 1
fi
if [ ! -r ${file} ]; then
echo "Insufficient file persmissons: ${file}"
exit 1
fi
psoutput=$(ps -p ${processid} -o comm=)
if [ $? == 0 ];then
if [ ${psoutput} == "sshd" ]; then
echo "sshd process is realy running with process id ${processid}"
exit 0
else
echo "given process id ${processid} is not sshd: ${psoutput}"
exit 1
fi
else
echo "there is no process runing with process id ${processid}"
exit 0
fi
pgrep è un bel comando, ma ti troverai nei guai quando hai più istanze in esecuzione. Ad esempio, quando hai un normale sshd in esecuzione sulla porta TCP/22 e hai un altro sshd in esecuzione sulla porta TCP/2222, allora pgrep fornirà due ID di processo durante la ricerca di sshd ... quando il normale sshd ha il suo pid in /var/run/sshd.pid e l'altro potrebbe avere il suo pid in /var/run/sshd-other.pid puoi differenziare chiaramente i processi.
Non consiglia di utilizzare solo ps , reindirizzando attraverso una o più pipe con grep e grep -v cercare di filtrare tutte le altre cose che non ti interessano... è un po' come usare
find . | grep myfile
per capire se un file esiste.
Soluzione 4:
Non è affidabile controllare semplicemente l'esistenza di un processo con lo stesso pid contenuto nel file.
Ma molte implementazioni di pidfile eseguono anche il blocco sul pidfile, in modo che se il processo muore, il blocco scompare. A condizione che il meccanismo di blocco sia affidabile, verificare se il file è ancora bloccato è un meccanismo relativamente affidabile per determinare se il processo originale è ancora in esecuzione.