GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

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.


Linux
  1. Auf Prozess prüfen, wenn dieser läuft?

  2. Überprüfen Sie das offene FD-Limit für einen bestimmten Prozess in Linux

  3. Python-Bibliothek für das Linux-Prozessmanagement

  4. Wie kann überprüft werden, welche gemeinsam genutzten Bibliotheken zur Laufzeit für einen bestimmten Prozess geladen werden?

  5. So legen Sie die Prozess-ID in Linux für ein bestimmtes Programm fest

Die Einstellung in Bash für Globbing, um zu steuern, ob * mit Punktdateien übereinstimmt?

Pseudodateien für temporäre Daten?

Welcher Prozess hat Pid 0?

Max offene Dateien für den Arbeitsprozess

Bestimmen des bestimmten Prozessors, auf dem ein Prozess läuft

Bestimmen Sie, in welcher Gruppe(n) sich ein laufender Prozess befindet?