
Ich verwende RHEL 7.5 und habe ein Java-Programm, das eine Datei mit der PID-Nummer enthält. Wenn der Prozess beendet wird, existiert die Datei immer noch und ich führe ein Skript aus, um zu überprüfen, ob die in dieser Datei gespeicherte PID aktiv ist oder nicht, aber ich habe Zweifel oder ein Problem.
Die PID 445 existiert und 2445 existiert. Wie kann ich also nur die 445 bekommen?
Ich habe es mit dem folgenden Befehl versucht:
ps -ax | egrep "^ 445"
Aber es hat nichts zurückgegeben.
Die beiden Prozesse:
ps -ax | grep -v grep | egrep "445"
445 pts/2 Sl 3:50 /opt/
2445 ? S 0:00 dbus-launch
Antwort1
Verwenden -p
:
-p proclist
Schreiben Sie Informationen für Prozesse, deren Prozess-ID-Nummern in angegeben sindproclist
. […]
(Quelle)
In Ihrem Fall:
ps -p 445
POSIX sagt, ps
dass ein positiver Exit-Status zurückgegeben werden soll, wenn „ein Fehler aufgetreten ist“. Jeder ps
von mir getestete Wert berücksichtigt, proclist
dass nicht mindestens eine PID einesbestehendeProzess als "fehlerhaft" zu markieren. Das ist sinnvoll. Beispiel:
ps -p 445 >/dev/null && echo "Process exists."
Anmerkungen:
- PIDs beendeter Prozesse können/werden eventuell wiederverwendet, also selbst wenn der PID verwendet wird, handelt es sich möglicherweise nicht um den Prozess, an dem Sie interessiert sind.
- Wenn die PID in der Datei von vor dem letzten (Neu-)Booten stammt, existiert der Prozess offensichtlich nicht mehr, auch wenn die PID jetzt verwendet wird. (Hinweis:Konfigurieren Sie das Programm so, dass die Datei
tmpfs
).
Antwort2
kill -0
Sie können in Bash-Skripten mit folgendem Befehl prüfen, ob ein Prozess ausgeführt wird :
if [ -f ${pid_file} ] && kill -0 $(cat ${pid_file}) 2>/dev/null; then
exit
else
rm -rf ${pid_file}
exit
fi
Dies ${pid_file}
entspricht dem Dateipfad mit der darin enthaltenen PID. Dies -f ${pid_file}
prüft, ob die PID-Datei vorhanden ist. Anschließend kill -0 $(cat ${pid_file})
prüft es, ob der Prozess ausgeführt wird.
Was im Wesentlichen darauf hinausläuft:
- Wenn der Prozess ausgeführt wird, tun Sie einfach nichts, sondern beenden Sie das Skript.
- Andernfalls (wenn der Prozessnichtläuft, entfernen Sie einfach die PID-Datei.
Die Magie dahinter kill -0
wird auf der Manpage für erklärtkill
:
WennSignaturist 0, dann wird kein Signal gesendet, aber trotzdem eine Fehlerprüfung durchgeführt; dies kann verwendet werden, um die Existenz einer Prozess-ID oder Prozessgruppen-ID zu prüfen.