Lösung 1:
einfach ausgedrückt:nein :Ein Prozess (z. B. ein Daemon) kann abstürzen und hat keine Zeit, seine .pid-Datei zu löschen.
Eine Technik, um den Status eines Programms sicherer zu machen:Verwenden Sie einen expliziten Kommunikationskanal wie einen Socket. Schreiben Sie den Socket-Port in eine Datei und haben Sie den supervisor
Prozess nachschlagen.
Sie können auch die Dienste von DBus unter Linux nutzen:Registrieren Sie einen bestimmten Namen und lassen Sie Ihren Supervisor-Prozess (wie auch immer Sie ihn nennen) nach diesem Namen suchen.
Es gibt zahlreiche Techniken.
Eine Sache, die Sie sich merken sollten:Es liegt nicht in der Verantwortung des Betriebssystems, die PID-Dateien zu verwalten.
Lösung 2:
Jldupont hat Recht mit der Aussage, dass .pid-Dateien nicht zuverlässig sind um festzustellen, ob ein Prozess läuft, da die Datei im Falle eines Absturzes möglicherweise nicht entfernt wird.
Abgesehen von den Rennbedingungen verwende ich oft pgrep wenn ich wissen muss, ob ein Prozess läuft. Ich könnte dann die Ausgabe mit den .pid-Dateien vergleichen, wenn ich es für notwendig halte.
Lösung 3:
Eine Datei, die eine Prozess-ID enthält, ist nicht zuverlässig, um festzustellen, ob ein Prozess ausgeführt wird oder nicht. Es ist nur eine zuverlässige Quelle, um die letzte angegebene Prozess-ID für den Prozess herauszufinden.
Wenn Sie die Prozess-ID haben, müssen Sie weiter prüfen, ob der Prozess wirklich läuft.
Hier ist ein Beispiel:
#!/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 ist ein netter Befehl, aber Sie werden Probleme bekommen, wenn Sie mehrere Instanzen ausführen. Wenn Sie zum Beispiel einen regulären sshd auf Port TCP/22 und einen anderen sshd auf Port TCP/2222 haben, liefert pgrep zwei Prozess-IDs, wenn nach sshd gesucht wird ... wenn die normale sshd ihre PID in /var/run/sshd.pid hat und die andere ihre PID in /var/run/sshd-other.pid haben könnte, können Sie die Prozesse klar unterscheiden.
Ich nicht empfehlen, nur ps zu verwenden , durch eine oder mehrere Pipes mit grep leiten und grep -v versuchen, alles andere Zeug herauszufiltern, das Sie nicht interessiert ... es ist ein bisschen wie mit
find . | grep myfile
um herauszufinden, ob eine Datei existiert.
Lösung 4:
Es ist nicht zuverlässig, einfach die Existenz eines Prozesses mit derselben PID wie in der Datei enthalten zu prüfen.
Aber viele pidfile-Implementierungen sperren auch die pidfile, sodass die Sperre aufgehoben wird, wenn der Prozess stirbt. Vorausgesetzt, der Sperrmechanismus ist zuverlässig, ist die Überprüfung, ob die Datei noch gesperrt ist, ein relativ zuverlässiger Mechanismus, um festzustellen, ob der ursprüngliche Prozess noch läuft.