GNU/Linux >> LINUX-Kenntnisse >  >> Linux

UNIX / Linux:7 praktische Beispiele für PS-Befehle zur Prozessüberwachung

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.

angibt

Der 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

Linux
  1. 8 praktische Beispiele für den Linux-Xargs-Befehl für Anfänger

  2. cp-Befehl unter Linux:7 praktische Beispiele

  3. Linux-Shutdown-Befehl:5 praktische Beispiele

  4. 5 praktische Beispiele des dd-Befehls unter Linux

  5. UNIX / Linux:10 Netstat-Befehlsbeispiele

12 praktische Beispiele für In Command unter Linux

15 Praktische Beispiele für den Rsync-Befehl unter Linux

5 praktische Beispiele für Tail-Befehle unter Linux

Echo-Befehl unter Linux:7 praktische Beispiele

Praktischer Ping-Befehl in Linux-Beispielen

15 Praktische Grep-Befehlsbeispiele in Linux / UNIX