Sind PID-Dateien zuverlässig, um festzustellen, ob ein Prozess ausgeführt wird?

11

Viele Programme wie sshd erstellen PID-Dateien in / var / run /, die ihre Prozess-ID enthalten. Sind diese Dateien zuverlässig, um festzustellen, ob ein Prozess ausgeführt wird? Ich vermute, dass diese Dateien manuell von einem Prozess erstellt werden und daher weiterhin im Dateisystem verbleiben, wenn das Programm abstürzt.

indiv
quelle

Antworten:

16

in einfachen Worten, nein : Ein Prozess (z. B. ein Daemon) kann abstürzen und hat nicht die 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 lassen Sie ihn vom supervisorProzess 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.

Eines ist zu beachten: Es liegt nicht in der Verantwortung des Betriebssystems, die PID-Dateien zu verwalten.

jldupont
quelle
1
Das Vorhandensein der PID-Datei, KOMBINIERT mit dem Vorhandensein des Prozesses, sollte jedoch ausreichend sein. Wenn der Prozess beendet wird, können Sie dies überprüfen. PIDs werden zwar wiederverwendet, aber nicht sehr oft.
MarkR
2
Wie oft eine PID wiederverwendet wird, hängt vom jeweiligen System ab. Ich habe ein System gesehen, bei dem PIDs mindestens täglich durchlaufen wurden. Sie müssen die PID überprüfen, ob es einen Prozess gibt und ob der Prozess derjenige zu sein scheint, von dem Sie erwarten, dass er die PID besitzt.
@atk: genau. Es gibt keinen Standard an sich und selbst wenn es einen gab, kann er von einigen Implementierungen sehr gut nicht beachtet werden. Zum Beispiel kann ich einen Daemon erstellen, der überhaupt keine PID-Datei schreibt, und einen Rückkanal verwenden, um seine Verwaltungsbefehle abzurufen.
Jldupont
@atk: Leider gibt es keine Möglichkeit sicherzustellen, dass die PID zwischen dem Zeitpunkt der Überprüfung und dem Zeitpunkt der Verwendung nicht wiederverwendet wird ...
SamB
3

Jldupont gibt zu Recht an, dass PID-Dateien nicht zuverlässig sind, um festzustellen, ob ein Prozess ausgeführt wird, 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 ausgeführt wird. Ich könnte dann die Ausgabe mit den PID-Dateien vergleichen, wenn ich dies für notwendig hielt.

jschmier
quelle
3

Eine Datei mit einer Prozess-ID ist nicht zuverlässig. Bestimmen Sie, ob ein Prozess ausgeführt wird oder nicht. Es ist nur eine zuverlässige Quelle, um die zuletzt angegebene Prozess-ID für den Prozess herauszufinden.

Wenn Sie die Prozess-ID haben, müssen Sie weiter prüfen, ob der Prozess wirklich ausgeführt wird.

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 in Schwierigkeiten geraten, wenn mehrere Instanzen ausgeführt werden. Wenn beispielsweise ein reguläres sshd auf Port TCP / 22 und ein anderes sshd auf Port TCP / 2222 ausgeführt wird, liefert pgrep bei der Suche nach sshd zwei Prozess-IDs ... wenn das normale sshd seine pid in / var hat /run/sshd.pid und der andere könnte seine PID in /var/run/sshd-other.pid haben. Sie können die Prozesse klar unterscheiden.

Ich empfehle nicht , nur ps zu verwenden und mit grep und grep -v durch eine oder mehrere Pipes zu leiten , um alle anderen Dinge herauszufiltern, die Sie nicht interessieren ... es ist ein bisschen wie mit

find . | grep myfile

um herauszufinden, ob eine Datei beendet wird.

Mirko Steiner
quelle
2

Es ist nicht zuverlässig, einfach das Vorhandensein eines Prozesses mit derselben PID zu überprüfen, die in der Datei enthalten ist.

Viele Pidfile-Implementierungen sperren jedoch auch die Pidfile, sodass die Sperre aufgehoben wird, wenn der Prozess abbricht. 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 ausgeführt wird.

Paul Brannan
quelle
1

Jldupont ist richtig.

Sie können dem Prozess jedoch ein 0-Signal senden (kill -s 0 pid), um festzustellen, ob der Prozess noch aktiv ist (vorausgesetzt, Sie haben die Berechtigung, ein solches Signal zu senden - im Allgemeinen darf nur der Eigentümer eines Prozesses senden es ist ein Signal).


quelle
4
Die Überprüfung der Existenz eines Prozesses mit dieser PID bedeutet jedoch nicht, dass es sich um die PID handelt, an der Sie interessiert sind.
Januar
0

Ich stimme jschmier zu.

Auf einigen Systemen erhalten Sie keinen Zugriff auf pgrep. In einem solchen Fall können Sie ps -aef | grep <pid>herausfinden, ob der Prozess wirklich ausgeführt wird.

user29584
quelle
1
Der entscheidende Punkt in der Frage war "zuverlässig". Ein ps zu machen und nach einer PID zu suchen ist nicht zuverlässig.
Januar
Nun ... unter der Annahme, dass Sie den Namen des Programms kennen, warum denken Sie, ps -aef | grep ist unzuverlässig?
user29584
3
Rennbedingungen: Der Status des Systems hat sich bis zum Ende von ps geändert. Prozesstitel: Ein anderer Prozess könnte einen ähnlichen Titel haben wie der, an dem Sie interessiert sind. Mehrere Instanzen: Stellen Sie sich ein System mit zwei Instanzen desselben Dienstes mit jeweils einer PID-Datei vor. Einer schlägt fehl und der andere startet neu und erhält die PID des ersten Dienstes. Wie erzählst du? Usw. Nicht zuverlässig, aufgrund der Rennbedingungen nicht richtig zu machen, und es gibt zuverlässige Techniken, die einfach funktionieren. Für eine zuverlässige Alternative siehe zum Beispiel cr.yp.to/daemontools.html
janm