Wie kann man überprüfen, ob eine PID läuft?

12

Ich habe eine .pidDatei und muss prüfen, ob der Prozess ausgeführt wird. Bisher habe ich zwei Möglichkeiten gefunden

kill -0 `cat something.pid`

Dies gibt einen Fehler aus, wenn die PID nicht läuft. Ich weiß, dass dies umgeleitet werden kann /dev/null, aber ich denke, dass dies nicht die beste Lösung ist.

Die zweite Lösung wäre zu verwenden ps, die aber auch auf dem STDOUT druckt

ps -ef `cat something.pid`

Ist es normal, die Ausgabe umzuleiten /dev/nullund nur den zurückgegebenen Statuscode zu verwenden, oder ist es ein Zeichen dafür, dass ich etwas falsch mache und einen anderen Befehl benötige?

Jakub Arnold
quelle
5
Verwendung kill -0gemäß POSIX-Standard.
Anders

Antworten:

8

Für die meisten Linux-Distributionen ist die Aufzählung von / proc / {pid} ein guter Weg, um Informationen über die laufenden Prozesse zu erhalten und normalerweise darüber, wie die Userspace-Befehle wie "ps" mit dem Kernel kommunizieren. So können Sie zum Beispiel tun;

[ -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

Bearbeiten: Sie sollten überprüfen, ob kpid gesetzt ist, aber dies ist nützlicher, da es für unset $ {kpid} "nicht existiert" zurückgibt.

[ -n "${kpid}" -a -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"
Tom H
quelle
@SteveMuster Dies würde die Antwort Linux-spezifisch machen. Unter OSX gibt es kein / proc. Und ich denke, es gibt kein / proc auf BSD.
Asche
Hinweis mit diesem Sie brauchen , um sicher ${kpid}vorhanden
Wilf
@Wilf Ich bearbeitete es, so gibt es "Prozess existiert nicht" für unset $ {kpid}
Tom H
Danke - Ich habe ein Skript erstellt, das eine PID mit einer ähnlichen Methode überprüft, und es hat nicht funktioniert, bis ich herausgefunden habe, dass dies das Problem ist :)
Wilf
6

Wie Anders bemerkte, sollten Sie kill -0für die POSIX-Konformität verwenden.

Auf Linux-Systemen können Sie auch prüfen, ob eine Datei im Dateisystem / proc vorhanden ist, z.

-f /proc/$(cat something.pid)/status
cjc
quelle
1

Wenn dies in einem Skript enthalten ist (was meiner Meinung nach der Fall ist, da Sie Bedenken haben, auf stdout zu drucken), können Sie dies folgendermaßen tun:

if ps -p $(cat something.pid) > /dev/null 2>&1
then
    kill $(cat something.pid)
else
    # Deal with the fact that the process isn't running
    # i.e. clear up the pid file
fi

Das ps -psucht nach einem Prozess mit der in something.pid angegebenen $()PID (die Syntax ist eine etwas neuere Version des Backtick. Backtick muss unter bestimmten Umständen maskiert werden, was das neue Formular nicht tut). Die 2>&1Weiterleitungen stderr auch für diesen Befehl.

Wenn der ps -pBefehl den Prozess mit dieser PID nicht findet, wird er mit einem Fehler> 0 beendet und elseausgeführt. Ansonsten die killAussage. Sie können das oben Gesagte negieren, indem Sie Folgendes tun:

if ! ps -p ...

Hoffe das beantwortet deine Frage. Seien Sie natürlich vorsichtig und testen Sie viel, wenn Sie gefährliche Befehle wie kill.

webtoe
quelle
1

Hier sind einige Optionen:

  • Wenn Sie ein Init-Skript schreiben (z. B. das, in das /etc/init.d/Sie es einfügen möchten) und eine Debian-basierte Distribution verwenden, sollten Sie Folgendes verwenden start-stop-daemon:
    # start-stop-daemon -T -p $PIDFILE -u $USER_NAME -n $NAME
    Sie sollten den Exit-Code 0 erhalten, wenn er ausgeführt wird.
  • Sie können pgrep und pkill aus dem procpsPaket verwenden:
    pgrep --pidfile $PIDFILE
Jollyroger
quelle
0

Wenn Sie eine PID-Datei haben, können Sie mit pgrep prüfen, ob der Prozess ausgeführt wird:

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi
Dima L.
quelle