Linux-Tutorial / PID und PPID erklärt: Prozesse finden und verwalten
Eine PID (Prozess-ID) identifiziert einen laufenden Prozess. Eine PPID (Elternprozess-ID) identifiziert den aktuellen übergeordneten Prozess; dieser Elternprozess kann sich nach einer Reparenting-Operation ändern. Unter Linux helfen diese Zahlen dabei, einen Prozess zu finden, seine Eltern-Kind-Beziehung zu überprüfen und bei Bedarf ein Signal an einen bestimmten Prozess zu senden. Der Kernel weist die Zahlen zu; Sie verwalten die Prozesse, die sie derzeit identifizieren, nicht die PID-Zahlen selbst.
Was ist der Unterschied zwischen einer PID und einer PPID?
Ein Prozess ist eine laufende Instanz eines Programms. Dasselbe Programm zweimal auszuführen, erzeugt normalerweise zwei Prozesse mit unterschiedlichen PIDs. Wenn ein Prozess einen anderen erstellt, hat der neue Prozess ebenfalls eine PPID, die auf seinen Elternprozess zeigt.
| Feld | Bedeutung | Warum es wichtig ist |
|---|---|---|
| PID | Die aktuelle Prozess-ID | Wählen Sie einen bestimmten Prozess zur Inspektion oder zum Signalisieren aus |
| PPID | Die PID des übergeordneten Prozesses des aktuellen Prozesses | Identifizieren Sie den Ersteller und untersuchen Sie Eltern-Kind-Beziehungen |
Zum Beispiel, wenn eine Shell die PID 4250 hat und ein sleep-Prozess, der von dieser Shell gestartet wurde, die PID 4321 hat, kann der sleep-Prozess 4250 als seine PPID anzeigen. Diese Zahlen sind illustrativ. Eine PID ist keine permanente Kennung: Nach Beendigung eines Prozesses kann seine Nummer wiederverwendet werden. In Umgebungen mit PID-Namespaces, wie Container, kann derselbe Prozess außerdem unter unterschiedlichen PID-Nummern erscheinen, abhängig davon, wo er beobachtet wird.
Wie kann man die PID und PPID eines Prozesses überprüfen?
Die direkteste Methode ist, ps nach den Spalten zu fragen, die Sie benötigen. In Bash expandiert $$ zur PID der aktuellen Shell, sodass der folgende Befehl Informationen über diese Shell anzeigt:
ps -p "$$" -o pid,ppid,user,stat,etime,args
Die Ausgabe hängt von Ihrer Umgebung ab. PID ist die eigene Nummer der Shell, während PPID den übergeordneten Prozess identifiziert. USER nennt den Besitzer, STAT zeigt den Prozesszustand, ELAPSED zeigt, wie lange er bereits läuft, und COMMAND oder ARGS zeigt den Befehl.
PID PPID USER STAT ELAPSED COMMAND 4250 4110 learner Ss 00:42 -bash
Die oben genannten Zahlen und der Benutzername sind Beispielausgaben, nicht Werte, die auf Ihrem System zu erwarten sind. Sie können eine bekannte PID mit ps -p 4321 -o pid,ppid,args prüfen; wenn dieser Prozess beendet ist, erscheint keine passende Prozesszeile. Um alle derzeit sichtbaren Prozesse aufzulisten, verwenden Sie ps -eo pid,ppid,user,stat,args. Leiten Sie eine lange Liste an less weiter, wenn Sie sie durchsuchen müssen.
Um eine PID anhand des Prozessnamens zu finden, versuchen Sie pgrep -a -x sleep. Die Option -x erfordert eine genaue Übereinstimmung des Prozessnamens, und -a enthält die Befehlszeile. Mehrere Prozesse können denselben Namen haben, daher beweist eine übereinstimmende PID allein nicht, dass Sie Ihren eigenen Job gefunden haben. Der ps-Befehlsleitfaden und der pgrep-Befehlsleitfaden erklären die Optionen ausführlicher.
Untersuchen Sie Eltern-Kind-Beziehungen, ohne Prozesse zu ändern
Verwenden Sie Prozess- und Jobverwaltung für die grundlegende Übung zum Erstellen und Signalisieren. Untersuchen Sie hier die aktuelle Shell und deren direkte Kinder, ohne etwas zu beenden. Der prüfende ps-Befehl kann selbst als temporäres Kind erscheinen, und Prozesse können zwischen den Abfragen beendet werden.
ps -p "$$" -o pid,ppid,user,lstart,args ps --ppid "$$" -o pid,ppid,stat,args
In interaktivem Bash identifiziert $$ diese Shell. Innerhalb einer in Klammern stehenden Bash-Subshell kann es den Wert der übergeordneten Bash beibehalten; unterscheiden Sie $BASHPID, wenn Sie den aktuellen Bash-Prozess benötigen. Falls installiert, bietet pstree -p "$$" eine optionale Baumansicht.
Unterscheiden Sie PID-Namespaces von der PID-Wiederverwendung
Der gleiche Prozess kann unterschiedliche PIDs haben, je nachdem, ob man ihn von einem Host oder einem Container aus betrachtet. Diese Befehle lesen die aktuelle PID-Namespace-Kennung der Shell und die über dieses proc-Dateisystem sichtbare PID-Hierarchie. Ein einzelner Namespace kann nur einen NSpid-Wert anzeigen; Kernel-Konfiguration, Proc-Sichtbarkeit und Berechtigungen können das Ergebnis einschränken.
readlink "/proc/$$/ns/pid" grep '^NSpid:' "/proc/$$/status"
Ein Unterschied im Namespace spiegelt den Standort des Beobachters wider. Eine PID-Wiederverwendung tritt auf, wenn ein späterer Prozess eine Nummer erhält, die zuvor von einem beendeten Prozess genutzt wurde. Verwechseln Sie die beiden nicht oder mischen Sie Host- und Container-PIDs beim Senden von Signalen.
Was passiert, wenn ein Elternprozess beendet wird oder sich eine PID ändert?
Das Beenden eines übergeordneten Prozesses beendet nicht notwendigerweise alle seine Kindprozesse. Ein überlebender Kindprozess kann einem anderen Prozess untergeordnet werden, sodass sich seine PPID ändern kann. Gehen Sie nicht davon aus, dass das Signalisieren einer übergeordneten PID jeden darunter liegenden Prozess bereinigt.
Umgekehrt kann ein Kindprozess, der beendet ist, dessen übergeordneter Prozess jedoch seinen Beendigungsstatus noch nicht abgeholt hat, kurzzeitig als Zombie-Prozess verbleiben. Das Kind läuft nicht mehr, daher ist das wiederholte Senden von KILL an diese PID nicht die Lösung. Prüfen Sie, wie der übergeordnete Prozess seine Kinder abräumt. Bashes wait kann den Beendigungsstatus eines von dieser Shell erstellten Kindes abholen.
Eine PID identifiziert einen Prozess zu einem bestimmten Zeitpunkt. Wählen Sie ein Beendigungsziel nicht nur aufgrund einer alten PID-Datei oder einer zuvor notierten Zahl. Überprüfen Sie stattdessen Befehl, Besitzer und Startzeit zusammen. Achten Sie darauf, beim Arbeiten innerhalb und außerhalb eines Containers die PID-Zahlen aus verschiedenen Namespaces nicht zu verwechseln.
Wie sollten Sie einen Serviceprozess verwalten?
Ein von systemd verwalteter Dienst kann nach einem Neustart eine andere PID erhalten. In diesem Fall sollten Sie die Serviceeinheit überprüfen und verwalten, anstatt direkt an eine PID ein Signal zu senden. Wenn beispielsweise nginx.service tatsächlich installiert ist, überprüft systemctl status nginx.service dessen Status. Verwenden Sie sudo systemctl restart nginx.service nur, wenn ein Neustart betriebsbedingt sinnvoll ist. Wenn nginx nicht installiert ist oder das System einen anderen Service-Manager verwendet, verifizieren Sie zuerst den korrekten Servicenamen und die Verwaltungsmethode.
Eine PID hilft Ihnen, einen bestimmten Prozess zu identifizieren; eine PPID hilft Ihnen, seine übergeordnete Beziehung zu verstehen. Bevor Sie die Arbeit beenden, grenzen Sie das genaue Ziel ein, anstatt jedem Prozess mit einem passenden Namen ein Signal zu senden. Bei einem verwalteten Systemdienst verwenden Sie dessen Service-Manager.
PID-Namespace-Dokumentation und proc-Statusfeld-Dokumentation erklären Sichtbarkeit und das NSpid-Feld.
Primäre Referenzen
Die ps(1)-, pgrep(1)-, pstree(1)- und kill(1)-Anleitungen beschreiben Inspektion und Signalisierung. Die Bash-Sonderparameter und Bash-Job-Control-Builtins-Dokumente erklären $$, $! und wait. Siehe wait(2) für Elternprozess-Beendigung und Zombie-Prozesse.




