Sie sind hier:

Bash-Befehl ps

.

Bash-Befehl ps

2010-01-16 12:09 (Kommentare: 4)

Wie man sehen kann, was der Rechner grad so treibt? Teil 3

Nachdem nun top und htop vorgestellt sind, geht es nun um den Bashbefehl ps (Prozessstatus). Ps bietet im Gegensatz zu top oder htop keine dynamische Ausgabe der laufenden Prozesse. Nach der Befehls- oder Kommandoeingabe erfolgt eine statische Ausgabe der eigenen oder aller laufender Prozesse, je nach angehangener Option. Ps ist ein Befehl, der bereits bei Unix-Systemen (SVR4- und BSD-Versionen) Anwendung fand und in die GNU/Linux-Struktur übernommen wurde. Die Folge ist, dass mehrere Parameter (Optionen) zur gleichen Ausgabe führen.

Die Ausgabe des Befehles sieht folgendermaßen aus:

helena@helena-home:~$ ps
PID TTY TIME CMD
3820 pts/1 00:00:00 bash
3979 pts/1 00:00:00 ps

Ohne Optionen zeigt er mir also an, welche Prozesse gerade in dieser Shell laufen, inklusive der Shell. TTY ist hier die einzige Spaltenangabe, die neu ist. Es steht für das Terminal, in dem der Prozess gerade läuft. TIME ist eine Spaltenangabe, die bereits bekannt ist, aber hier eine andere Bedeutung hat. Sie gibt nämlich die gebrauchte CPU-Zeit des Prozesses an und nicht den Zeitpunkt an dem der Prozess gestartet wurde.

Kleiner Schlenker: Wo liegt der Unterschied zwischen Prozess und Programm? Ich versuche das mit einem Beispiel zu erklären. Wenn ein Programm ein gesamtes Buch ist, dann sind Prozesse, die einzelnen Kapitel des Buches, die von der CPU abgearbeitet werden.

Kleiner Schlenker 2: Was ist ein Terminal im Gegensatz zu einer Bash? Ein Terminal kann sowohl textorientiert sein oder eine grafische Ausgabe habe. Ein Terminal ist also ein textbasiertes oder grafisches Ein- und Ausgabegerät eines Rechners. Eine Bash hingegen ist nur textorierentiert. Man könnte also sagen, dass eine Bash ein Terminal ist, aber ein Terminal muss keine Bash sein.

So nach diesen Begriffsdefinitionen zurück zum Befehl ps. Ps kann mir aber auch alle laufenden Prozesse anzeigen, es kann mir auch nur einen bestimmten Prozess anzeigen oder auch nur die Prozesse von root. Ich kann weitere Spalten in die Ausgabe aufnehmen oder eine bestimmte Sortierung erzwingen. Ich gehe diese Möglichkeiten jetzt einzeln durch.

Alle laufenden Prozesse erfordern folgenden Befehl: ps -ef für alle Prozesse (Standardsyntax); ps aux für alle Prozesse (BSD-Syntax)

helena@helena-home:~$ ps -ef                                                              
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10:31 ? 00:00:00 /sbin/init
root 2 0 0 10:31 ? 00:00:00 [kthreadd]
root 3 2 0 10:31 ? 00:00:00 [migration/0]
root 4 2 0 10:31 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 10:31 ? 00:00:00 [watchdog/0]
root 6 2 0 10:31 ? 00:00:00 [migration/1]
root 7 2 0 10:31 ? 00:00:02 [ksoftirqd/1]
root 8 2 0 10:31 ? 00:00:00 [watchdog/1]
root 9 2 0 10:31 ? 00:00:00 [events/0]
root 10 2 0 10:31 ? 00:00:03 [events/1]
root 11 2 0 10:31 ? 00:00:00 [cpuset]
root 12 2 0 10:31 ? 00:00:00 [khelper]

Hierbei handelt es sich lediglich um einen Auszug. Eine Besonderheit fällt auf, es wird nicht nur die PID sondern auch die PPID angeben. Man bekommt also zu jedem Prozess nicht nur die eigene Indetifikationsnummer, sondern auch die des Elternprozesses (PPID = Parentprozessidentification). So kann man beispielweise schauen, ob nur ein Prozess ein Zombie ist oder ob der Elternprozess auch ein Zombie ist. Nun im Gegensatz dazu ein Auszug der Bashausgabe von ps aux:

helena@helena-home:~$ ps aux                                                               
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2632 1392 ? Ss 10:31 0:00 /sbin/init
root 2 0.0 0.0 0 0 ? S< 10:31 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S< 10:31 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S< 10:31 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 10:31 0:00 [watchdog/0]
root 6 0.0 0.0 0 0 ? S< 10:31 0:00 [migration/1]
root 7 0.0 0.0 0 0 ? S< 10:31 0:02 [ksoftirqd/1]
root 8 0.0 0.0 0 0 ? S< 10:31 0:00 [watchdog/1]
root 9 0.0 0.0 0 0 ? S< 10:31 0:00 [events/0]
root 10 0.0 0.0 0 0 ? R< 10:31 0:03 [events/1]
root 11 0.0 0.0 0 0 ? S< 10:31 0:00 [cpuset]
root 12 0.0 0.0 0 0 ? S< 10:31 0:00 [khelper]

Es fällt auf, dass die Ausgabe, der BSD-Syntax folgend, ausführlicher ist. Ich habe hierbei ja auch eine Option mehr übergeben als bei ps -ef. Ps aux erinnert wieder sehr an die Ausgabe von top, nur das hier nach PID sortiert wurde und nicht nach CPU-Last. RSS ist der RES-Ausgabe von top gleichzusetzen, genauso wie VSZ der VIRT-Ausgabe von top. Die Statusspalte ist auch sehr spannend, da hier nicht nur schlafende, laufende, gestoppte Prozesse oder Zombies angeben werden, sondern es dazu weitere Inforamtionen gibt. So ist der Init-Prozess (PID 1) Ss, dass heißt er schläft und ist Session Leader (also Anführer der Sitzung). Die anderen Prozesse haben ein < hinter der jeweiligen Statusangabe stehen, dieses Zeichen sagt mir, dass sie eine hohe Priorität haben und deshalb auch nicht nett (not nice) zu anderen Prozessen sind. Es gibt noch weitere Zeichen, wie +, L oder l, diese müßt ihr euch mal genauer in der Manpage von ps ansehen.

Die Ausgabe von nur einem Prozess erfolgt über eine Pipe. Pipes sind im Groben Um- und Weiterleitungen von Befehlen.

helena@helena-home:~$ ps -ef | grep firefox
helena      2844  1812 14 10:36 ?        00:48:09 /usr/lib/firefox-3.5.8pre/firefox
helena      4247  3820  0 15:59 pts/1    00:00:00 grep firefox

Diese Befehlskette zeigt mir also jeden Prozess an, der sich mit dem Wort 'firefox' beschäftigt, an. Auch wenn hierbei keine Spaltenbeschriftung erfolgt, ist die Reihenfolge dieselbe wie zuvor (User, PID, PPID,...). Suche ich nur nach der PID des Prozesses, reicht der Befehl pgrep.

helena@helena-home:~$ pgrep firefox
2844

Um sich alle Prozesse eines bestimmten Users angeben zu lassen, gibt es die Option -u [Argument]. Wenn ich mir also alle Prozesse von root anschauen will, geht das so:

helena@helena-home:~$ ps -u root                                                           
  PID TTY          TIME CMD                                                            
    1 ?        00:00:00 init                                                           
    2 ?        00:00:00 kthreadd                                                       
    3 ?        00:00:00 migration/0                                                    
    4 ?        00:00:00 ksoftirqd/0                                                    
    5 ?        00:00:00 watchdog/0                                                     
    6 ?        00:00:00 migration/1                                                    
    7 ?        00:00:03 ksoftirqd/1                                                    
    8 ?        00:00:00 watchdog/1                                                     
    9 ?        00:00:00 events/0                                                       
   10 ?        00:00:03 events/1                                                       
   11 ?        00:00:00 cpuset                                                         
   12 ?        00:00:00 khelper

Ich kann root natürlich auch durch einen beliebigen User ersetzen. Nun noch zu dem letzten Beispiel von ps, die eigene Spaltenangabe und -sortierung. Es ist also ein sehr individueller Aufruf von ps.

helena@helena-home:~$ ps -eo "user pcpu ppid pid nice comm"                        
USER %CPU PPID PID NI COMMAND
root 0.0 0 1 0 init
root 0.0 0 2 -5 kthreadd
root 0.0 2 3 - migration/0
root 0.0 2 4 -5 ksoftirqd/0
root 0.0 2 5 - watchdog/0
root 0.0 2 6 - migration/1
root 0.0 2 7 -5 ksoftirqd/1
root 0.0 2 8 - watchdog/1
root 0.0 2 9 -5 events/0
root 0.0 2 10 -5 events/1
root 0.0 2 11 -5 cpuset
root 0.0 2 12 -5 khelper

Die Option -o läßt die individuelle Konfiguration der Spalten zu.

Der Befehl ps hat also mannigfaltige Möglichkeiten eine Ausgabe zu erzeugen. Ist also das dynamische nicht wichtig, dann eignet er sich wunderbar zur Darstellung der Prozesse. Hier endet der Artikel zu ps, wer weitere Informationen wünscht, dem sei die Manpage mal wieder ans Herz gelegt.

Schlagwörter von diesem Beitrag

Zurück

Einen Kommentar schreiben

Kommentar von Stefan W. | 2010-04-09

Diese Befehlskette zeigt mir also jeden Prozess an, der sich mit dem Wort 'firefox' beschäftigt, an. [/quotde]
Weshalb das grep ungünstig ist.

Code:

ps -C firefox  

zeigt den firefox-Prozess.

Kommentar von Helena | 2010-04-09

Hallo Stefan,

das kommt darauf an, ob man wirklich alle Prozesse möchte oder eben nur den einen Firefox-Befehl.

Danke für deinen Kommentar.

Gruß Helena

Kommentar von Dirk | 2011-06-28

Hallo,

zum Thema ProzessID habe ich ein Anliegen:

Bei einem Script muss sichergestellt werden, dass dieses nur einmal gestartet wurde.

Um eine mehrfachen Start zu unterbinden, wird die PID in eine Datei geschrieben.

Beim Starten des Bash-Scripts soll wie folgt geprüft werden, ob ein Prozess bereits gestartet wurde:

#!/bin/bash

pidfile="./pid"

if [ -e $pidfile ]; then
echo "exits"
pidOld=`cat $pidfile`
check=`ps x | grep '^$pidOld\>'`
echo "$check"
if [ "$check" = "" ]; then
echo "process not exists"
else
echo "process exists"
fi
fi

Leider wird in der der Befehl `ps x | grep '^$pidOld\>'` nicht korrekt ausgeführt. Erst wenn statt der Variable $pidOld die entsprechende PozessID fest eingetragen wird, wird die ProzessID gefunden.

Kann mir vielleicht einer einen Tip geben, woran es liegt, das die Variable $pidOld nicht aufgelöst wird?

Falls dies nicht der richtige Ort sein sollte, um dieses Anliegen zu stellen, bitte ich um Entschuldigung.

Vielen Dank im voraus.

Kommentar von Helena | 2011-06-28

Hallo Dirk,

ich kann dir bei deinem Skript nicht adäquat weiter helfen. Ich empfehle Dir www.ubuntuusers.de und zwar die Rubrik Fortgeschrittene Themen -> Shell und Programmierung.

Viel Erfolg
Helena

zum Seitenanfang