Prozess ist eine laufende Instanz eines Programms. Linux ist ein Multitasking-Betriebssystem, was bedeutet, dass mehr als ein Prozess gleichzeitig aktiv sein kann. Verwenden Sie den Befehl ps, um herauszufinden, welche Prozesse auf Ihrem System ausgeführt werden.
Dieser Artikel erklärt 7 praktische Verwendungen des ps-Befehls und seiner Optionen.
Um die Prozesse zu überwachen und zu steuern, bietet Linux viele Befehle wie ps, kill, killall, nice, renice und top-Befehle.
1. Aktuell laufende Prozesse auflisten (ps -ef, ps -aux)
Es ist ein häufig verwendetes Beispiel mit einem ps-Befehl, um alle Prozesse aufzulisten, die derzeit auf einem Computer ausgeführt werden. Das folgende Beispiel zeigt die Optionen des Befehls ps, um alle Prozesse abzurufen.
$ ps -ef root 26551 5 0 Feb10 ? 00:03:41 [pdflush] root 26570 5 0 Feb10 ? 00:00:20 [pdflush] root 30344 3382 0 Feb21 ? 00:00:11 sshd: root@pts/14 root 30365 30344 0 Feb21 pts/14 00:00:02 -bash root 30393 3382 0 Feb21 ? 00:00:10 sshd: root@pts/15
Wo:
- -e um alle Prozesse anzuzeigen.
- -f, um eine Liste im vollständigen Format anzuzeigen.
Im Falle von BSD-Rechnern können Sie „ps -aux“ verwenden, um die Details über den gesamten Prozess wie oben gezeigt anzuzeigen.
$ ps -aux
2. Listen Sie den Prozess basierend auf der UID und den Befehlen auf (ps -u, ps -C)
Verwenden Sie die Option -u, um den Prozess anzuzeigen, der zu einem bestimmten Benutzernamen gehört. Wenn Sie mehrere Benutzernamen haben, trennen Sie diese durch ein Komma. Das folgende Beispiel zeigt alle Prozesse, die dem Benutzer wwwrun oder postfix.
gehören$ ps -f -u wwwrun,postfix UID PID PPID C STIME TTY TIME CMD postfix 7457 7435 0 Mar09 ? 00:00:00 qmgr -l -t fifo -u wwwrun 7495 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7496 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7497 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7498 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7499 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 10078 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 10082 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf postfix 15677 7435 0 22:23 ? 00:00:00 pickup -l -t fifo -u
Oft wird ps mit grep wie „ps -aux | grep-Befehl“, um die Liste der Prozesse mit dem angegebenen Befehl abzurufen.
Aber der Befehl ps selbst hat eine Option, um dasselbe zu erreichen. Das folgende Beispiel zeigt, dass alle Prozesse, die tatad.pl in ihrer Befehlsausführung haben.
$ ps -f -C tatad.pl UID PID PPID C STIME TTY TIME CMD root 9576 1 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9577 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9579 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9580 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9581 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9582 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 12133 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
Hinweis: Wir können Aliase für den Befehl ps erstellen, um Prozesse basierend auf Befehlen, Benutzern oder Gruppen aufzulisten.
3. Listen Sie die Prozesse basierend auf PIDs oder PPIDs auf (ps -p, ps –ppid)
Jedem Prozess wird eine eindeutige Prozess-ID (PID) zugewiesen.
Wenn Sie eine Anwendung starten, kann sie eine Anzahl von Prozessen verzweigen und jeder Unterprozess hat seine eigene PID. Jeder Prozess hat also seine eigene Prozess-ID und seine übergeordnete Prozess-ID.
Für alle Prozesse, die ein Prozess verzweigt, wird dieselbe PPID (Elternprozesskennung) verwendet. Die folgende Methode wird verwendet, um eine Liste von Prozessen mit einer bestimmten PPID zu erhalten.
$ ps -f --ppid 9576 UID PID PPID C STIME TTY TIME CMD root 9577 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9579 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9580 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9581 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9582 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 12133 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
Das folgende Beispiel soll die Prozesse auflisten, die PID gegeben haben.
$ ps -f -p 25009,7258,2426 UID PID PPID C STIME TTY TIME CMD root 2426 4 0 Mar09 ? 00:00:00 [reiserfs/0] root 7258 1 0 Mar09 ? 00:00:00 /usr/sbin/nscd postfix 25009 7435 0 00:02 ? 00:00:00 pickup -l -t fifo -u
4. Prozesse in einer Hierarchie auflisten (ps –forest)
Das folgende Beispiel zeigt die Prozess-ID und Befehle in einer Hierarchie. –forest ist ein Argument für den Befehl ps, der die ASCII-Art des Prozessbaums anzeigt. Anhand dieses Baums können wir den Elternprozess und die Kindprozesse, die rekursiv geforkt wurden, identifizieren.
$ ps -e -o pid,args --forest 468 \_ sshd: root@pts/7 514 | \_ -bash 17484 \_ sshd: root@pts/11 17513 | \_ -bash 24004 | \_ vi ./790310__11117/journal 15513 \_ sshd: root@pts/1 15522 | \_ -bash 4280 \_ sshd: root@pts/5 4302 | \_ -bash
Hinweis: Sie können auch den Befehl tree und pstree verwenden, um den Prozess in einer schönen Baumstruktur anzuzeigen.
5. Auflisten der verstrichenen Wandzeit für Prozesse (ps -o pid,etime=)
Wenn Sie die verstrichene Zeit für die derzeit laufenden Prozesse abrufen möchten, stellt der Befehl ps etime bereit, der die verstrichene Zeit seit dem Start des Prozesses in der Form [[dd-]hh:]mm:ss.
angibtDer folgende Befehl zeigt die verstrichene Zeit für die Prozess-IDs 1 (init) und Prozess-ID 29675 an.
Zum Beispiel stellt „10-22:13:29“ in der Ausgabe den Prozess dar, der init für 10 Tage, 22 Stunden, 13 Minuten und 29 Sekunden ausgeführt wird. Da der Init-Prozess während des Systemstarts beginnt, entspricht diese Zeit der Ausgabe des Befehls „uptime“.
# ps -p 1,29675 -o pid,etime= PID 1 10-22:13:29 29675 1-02:58:46
6. Alle Threads für einen bestimmten Prozess auflisten (ps -L)
Sie können eine Liste der Threads für die Prozesse abrufen. Wenn ein Prozess hängt, müssen wir möglicherweise die Liste der Threads identifizieren, die für einen bestimmten Prozess ausgeführt werden, wie unten gezeigt.
$ ps -C java -L -o pid,tid,pcpu,state,nlwp,args PID TID %CPU S NLWP COMMAND 16992 16992 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16993 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16994 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16995 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16996 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16997 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16998 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16999 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17000 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17001 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17002 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17003 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17024 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 15753 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 15754 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
Die Option -L wird verwendet, um die Liste der Threads für einen Prozess anzuzeigen, für den der Befehl angegeben ist. Und es zeigt auch nlwp an, das die Anzahl der leichten Prozesse darstellt. Im obigen Beispiel laufen insgesamt 15 Java-Threads.
7. Speicherleck finden (ps –sort pmem)
Technisch gesehen ist ein Speicherleck eine ständig zunehmende Speichernutzung durch eine Anwendung.
Bei gängigen Desktop-Anwendungen kann dies unbemerkt bleiben, da ein Prozess normalerweise den gesamten Speicher freigibt, den er verwendet hat, wenn Sie die Anwendung schließen.
Beim Client/Server-Modell ist Speicherverlust jedoch ein ernstes Problem, da erwartet wird, dass Anwendungen rund um die Uhr verfügbar sind. Anwendungen dürfen ihre Speichernutzung nicht unbegrenzt weiter erhöhen, da dies schwerwiegende Probleme verursachen kann. Um solche Speicherlecks zu überwachen, können wir die folgenden Befehle verwenden.
$ ps aux --sort pmem USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 1520 508 ? S 2005 1:27 init inst 1309 0.0 0.4 344308 33048 ? S 2005 1:55 agnt (idle) inst 2919 0.0 0.4 345580 37368 ? S 2005 20:02 agnt (idle) inst 24594 0.0 0.4 345068 36960 ? S 2005 15:45 agnt (idle) root 27645 0.0 14.4 1231288 1183976 ? S 2005 3:01 /TaskServer/bin/./wrapper-linux-x86-32
Im obigen ps-Befehl gibt die Option –sort das höchste %MEM unten aus. Notieren Sie sich einfach die PID für die höchste %MEM-Nutzung. Verwenden Sie dann den Befehl ps, um alle Details zu dieser Prozess-ID anzuzeigen und die Änderung im Laufe der Zeit zu überwachen. Sie mussten ir manuell wiederholen oder als Cron in eine Datei einfügen.
$ ps ev --pid=27645 PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 27645 ? S 3:01 0 25 1231262 1183976 14.4 /TaskServer/bin/./wrapper-linux-x86-32 $ ps ev --pid=27645 PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 27645 ? S 3:01 0 25 1231262 1183976 14.4 /TaskServer/bin/./wrapper-linux-x86-32
Hinweis: Wenn in der obigen Ausgabe RSS (resident set size, in KB) mit der Zeit zunimmt (genauso wie %MEM), kann dies auf ein Speicherleck in der Anwendung hindeuten.
Frühere Artikel in der Serie zur Überwachung und Optimierung der Linux-Leistung:
- 10 nützliche Sar (Sysstat)-Beispiele für die UNIX-/Linux-Leistungsüberwachung
- Einführung in die Linux-Leistungsüberwachung und -optimierung
- 15 praktische Beispiele für Top-Befehle unter Linux