Wie wähle ich einen bestimmten PID-Wert aus, wenn mehrere Prozesse eine ähnliche PID-Nummer enthalten?

Wie wähle ich einen bestimmten PID-Wert aus, wenn mehrere Prozesse eine ähnliche PID-Nummer enthalten?

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 sind proclist. […]

(Quelle)

In Ihrem Fall:

ps -p 445

POSIX sagt, psdass ein positiver Exit-Status zurückgegeben werden soll, wenn „ein Fehler aufgetreten ist“. Jeder psvon mir getestete Wert berücksichtigt, proclistdass nicht mindestens eine PID einesbestehendeProzess als "fehlerhaft" zu markieren. Das ist sinnvoll. Beispiel:

ps -p 445 >/dev/null && echo "Process exists."

Anmerkungen:

Antwort2

kill -0Sie 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 -0wird 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.

verwandte Informationen