|
In einem Multitasking-Betriebssystem wie Linux
läuft zu jedem Zeitpunkt eine Vielzahl von Prozessen, über die es interessante
Dinge herauszufinden gibt. Dazu gibt es das Kommando ps:
user@linux $
ps
PID TTY TIME CMD 18301 pts/1 0:00 bash 18901 pts/1 0:00 ps
|
Die Ausgabe bedeutet, dass unser Pinguin momentan zwei Prozesse
betreibt: Eine Shell und
ps selbst.
Die einzelnen Spalten bedeuten folgendes:
-
Die PID (Prozess ID) ist eine Nummer, die jeden Prozess
eindeutig identifiziert.
-
Unter TTY wird der Name des Terminals angegeben, das den
Prozess kontrolliert. Meist bedeutet dieser Name, dass der Prozess von diesem
Terminal aus gestartet worden ist, und für die Ein- und Ausgabe
benutzt wird.
-
TIME zeigt die von jedem dieser Prozesse bisher genutzte
Rechenzeit an.
-
CMD (oder COMMAND) zeigt den Befehl an, mit dem der Prozess
gestartet worden ist.
ps hat eine Unmenge von Optionen, die alle dazu dienen, die
Berge von Daten, die sich über Prozesse gewinnen lassen, zu
filtern. Die einfachste Möglichkeit der Auflistung
aller laufenden Prozesse ist ps -ax. Es werden alle
Prozesse aufgelistet, auch diejenigen, die nicht vom
aktuellen Benutzer gestartet wurden und die, die nicht mit
einem Terminal verbunden sind (also im Hintergrund laufen).
Diese Liste ist normalerweise sehr lang, daher sind nur die
ersten paar Zeilen wiedergegeben.
user@linux $
ps -ax
PID TTY STATE TIME COMMAND 1 ? S 0:04 init [2] 2 ? SW 0:00 [keventd] 3 ? SWN 0:00 [ksoftirqd_CPU0] ...
|
Bei ps -ax wird auch noch der Status (STATE)
des jeweiligen Prozesses ausgegeben. Dabei werden folgen Abkürzungen verwendet:
-
D (Deep sleeping)
Der Prozess befindet sich in einem ununterbrechbarer Schlaf.
-
R (Running)
Der Prozess verarbeitet im Moment gerade Daten.
-
S (Sleeping)
Der Prozess wartet auf irgendein Ereignis um Daten zu verarbeiten.
-
T (Traced)
Der Prozess wurde angehalten.
-
Z (Zombie)
Zombies sind Prozesse, die eigentlich schon beendet sein sollten, aber
immer noch auf irgendetwas warten. Sie können immer mal
wieder vorkommen und stellen keinen Grund zur Besorgnis dar,
solange sie nicht in Mengen auftreten und es sich nicht um
viele Zombies mit gleichem Namen handelt.
Stehen neben diesen Statusmeldungen noch ein oder mehrere Zeichen
bedeuten diese folgendes:
-
W
bedeutet, dass der Prozess in den Swap-Speicher ausgelagert
wurde und somit keine Speicherseiten belegt werden.
-
<
bedeutet, dass der Prozess mit einer höheren Priorität läuft.
-
N
bedeutet genau das Gegenteil. Der Prozess läuft mit einer
niedrigeren Priorität.
-
L (Locked)
bedeutet, dass der Prozess im Speicher geladen wurde und auch dort
gehalten wird.
|
Linux merkt sich, wenn ein Programm ein anderes startet.
Wenn der Elternprozess beendet wird, wird auch für das Ende
aller Kindprozesse gesorgt, damit diese nicht für immer
herumliegen und Platz wegnehmen. Die Baumstruktur der
laufenden Prozesse wird mit pstree oder mit
ps und der Option -f angezeigt:
user@linux $
pstree
init-+-atd |-automount |-cron |-httpd---httpd |-inetd |-kbgndwm |-kblankscrn.kss |-kdm-+-X | `-kdm---kwm |-kflushd
|-kfm-+-Eterm---bash---pstree | |-netscape---netscape | `-xemacs ...
|
Hier ist ein umfangreicher Ast. Man sieht, wie der Autor an
diesem Text mit XEmacs unter
KDE schreibt.
Gleichzeitig laufen noch ein Terminalfenster (Eterm), in dem gerade
pstree ausprobiert wird und netscape.
|
Der Systemverwalter kann seine Augen und Ohren nicht überall
haben, darum braucht er ein Programm, das ihm die
wichtigsten Prozesse anzeigt, die auf dem System laufen. Die
wichtigsten sind die, die am meisten Rechenzeit oder am
meisten Speicher belegen. Nach diesen Kriterien entscheidet
top.
 |
top
|
top fasst alle bisher genannten Kommandos zusammen und
fügt noch einiges hinzu.
-
Ganz oben stehen die von uptime bekannten
Werte (Systemzeit, Uptime, angemeldete Benutzer und Auslastung).
-
In der nächsten Zeile kommt die Anzahl der laufenden Prozesse und ihre
Zustände. Die Zustände wurden bereits bei
ps erklärt.
-
Die dritte Zeile zeigt den prozentualen Anteil an, womit sich der
(oder die) Prozessor(en) in den letzten Sekunden beschäftigt hat
(haben).
-
user:
Mit user sind Prozesse gemeint, die von den Benutzern des
Systems gestartet worden sind.
-
system:
Hierbei sind sämtliche Prozesse gemeint, die vom
System gestartet worden sind.
-
nice:
Damit sind all die Prozesse gemeint, die nicht mit einem
nice von 0 (null) laufen.
-
idle:
Mit idle wird die noch zur Verfügung stehende Prozessorlast bezeichnet.
-
Nun kommen noch die von
free
bekannten Speicherangaben.
Als letztes folgt die Liste mit den ressourcenträchtigesten
Prozessen. Im Gegensatz zu ps werden bei
top weitere Informationen zu den einzelnen Prozessen
ausgegeben:
-
User
gibt den Namen des Users an, unter welchem der Prozess läuft.
-
PR
gibt die Priorität des Prozesses an
-
NI
gibt den Nice-Wert an. Ein negativer Wert bedeutet
eine höhere Priorität, ein positiver Wert eine
geringere Priorität.
-
VIRT
gibt die gesamte Anzahl an Speicher an, den dieser
Prozess benötigt, inklusive den Code, den Daten und
den geteilten Bibliotheken.
-
RES
gibt die Belegung des physikalischen Arbeitsspeichers
an. Auslagerungen im Swap-Speicher werden hier nicht
berücksichtigt.
-
SHR
gibt die Anzahl des Speichers an Daten an, die auch
von anderen Prozessen genutzt werden können.
-
S
gibt den Status des Prozesses an. Siehe dazu auch
die Erklärung bei ps.
-
%CPU
gibt an wieviel Prozent von der gesamten Prozessorleistung
der Prozess benötigt.
-
%MEM
gibt dasselbe wie %CPU an, diesmal aber bezogen auf den
physikalischen Arbeitsspeicher.
|
Die Aufgabe von tload ist es, die durchschnittliche Systemlast
in einer einfachen ASCII-Grafik darzustellen. Mit der Option
-d kann die Zeit in Sekunden angeben werden, nach der die
Grafik aktualisiert wird. Mit -s wird die Skalierung
angegeben, also wie viele Zeilen für eine Einheit verwendet werden. Je
größer die Zahl ist, desto gröber die Darstellung.
|
Manchmal kann es ganz nützlich sein, festzustellen welche
Prozesse eine bestimmte Datei benutzen. Für diese
Aufgabe gibt es den Befehl fuser gefolgt vom Dateinamen.
user@linux $
fuser ksycoca
ksycoca: 463 463m 471 471m 539 539m 546 546m
|
Diese Ausgabe sagt aus, dass die Datei ksycoca von den Prozessen
mit der PID 463, 471, 539 und 546 benutzt wird. Gefolgt von
der PID wird ein Buchstabe mit ausgegeben (in diesem Fall ist
es immer ein m). Dieser Buchstabe gibt an, wie der Prozess auf
die Datei zugreift. Konkret bedeuten die Buchstaben folgendes:
-
c:
Die Datei wird vom Prozess als Verzeichnis behandelt.
-
e:
Die Datei ist ausführbar und wird vom Prozess ausgeführt.
-
f:
Die Datei wurde vom Prozess geöffnet. Im Standard-Modus
wird das f weg gelassen. Somit ist auch klar, warum in
unserem Beispiel jede PID zweimal angegeben wurde.
-
m:
Die Datei ist eine Bibliothek, die gemeinsam von den
Prozessen genutzt wird.
-
r:
wird verwendet, wenn es sich um das
Wurzelverzeichnis
(root-Verzeichnis) handelt.
Auch für fuser gibt es noch eine Reihe weiterer Optionen.
Interessant dabei ist die Option -n. Diese erwartet noch
eine weitere Angabe:
-
file,
wenn es sich um eine Datei handelt. Dabei bewirkt
fuser -n file ksycoca dasselbe wie
fuser ksycoca
-
udp,
wenn sich die darauf folgende Angabe um einen
UDP-Port
handelt.
-
tcp,
bedeutet das gleiche wie udp mit dem Unterschied, dass ein
TCP-Port
gemeint ist.
Der oben beschriebe Buchstaben-Code ist auch für die Port-Angaben
gültig, da unter Linux Ports auch als Dateien behandelt werden.
Weitere wichtige Optionen sind noch:
-
-a:
Dabei werden auch Dateien ausgegeben, auf die gerade
kein Prozess zugreift.
-
-u:
Gibt in Klammern den zur PID gehörenden Benutzernamen aus.
-
-v (verbose)
gibt mehr Informationen aus.
|
kill ist - trotz seines Namens - nicht nur zum Beenden von
Prozessen geeignet. Es kann alle möglichen Signale an die Prozesse senden, die
vom Benutzer gestartet wurden, der kill aufruft. Ist dieser
Benutzer der Systemverwalter,
dann sind ihm alle Prozesse zugänglich.
Der Aufruf ist:
kill <Signal> <Prozess-ID>
Die Prozess-ID (PID) können Sie beispielsweise aus der Ausgabe des
Programmes ps entnehmen:
user@linux $
ps
[...] 19376 pts/0 00:00:00 ps
|
Hier ist die PID des ps-Prozesses selbst die 19376.
Wenn die PID negativ ist, wird <Signal> nicht an einen
bestimmten Prozess gesendet, sondern an alle Prozesse mit der angegebenen PGID.
Der Befehl lautet also dann folgendermaßen:
kill <Signal> -<PGID>
Anstelle der Prozess-ID kann auch -1 angegeben werden. Dabei
wird <Signal> an alle Prozesse gesendet, ausser dem
kill-Prozess selbst und init. Zudem
zeigt dieser Befehl nur bei den Prozessen Wirkung, bei welchen man die nötigen
Rechte hat.
Wenn Sie kein Signal angeben, sendet kill das
Signal 15 (SIGTERM),
das die meisten Programme dazu veranlasst, hinter sich aufzuräumen,
um sich dann zu beenden.
Weitere wichtige Signale sind SIGHUP (1) und
SIGKILL (9). SIGHUP steht
für hang-up. Wenn ein Benutzer sich über das Netzwerk
angemeldet hat und die Verbindung abbricht, z. B. weil ein Modem auflegt
(eben ein hang-up), wird dieses Signal an alle Prozesse
gesendet, die während dieser Anmeldesitzung gestartet wurden. Sie werden
dann beendet.
SIGKILL tut genau das, was sein Name andeutet: Es unternimmt
alles, um einem Prozess den Garaus zu machen.
user@linux $
kill -SIGKILL 12345
|
Eine Liste mit allen Signalen finden Sie entweder in der Manpage von kill
(man kill) oder mit dem Befehl kill -l.
Die Option -p sendet kein Signal an den Prozess, sondern
gibt nur den Namen des zur PID passenden Prozesses aus.
Die bash-Shell enthält einen eingebauten
Befehl kill, der im Prinzip dieselbe Auswirkung wie
/bin/kill hat, jedoch zwei Vorteile bietet:
Er erlaubt die Verwendung von Job-IDs statt PIDs,
und wenn Sie die maximale Anzahl von Prozessen gestartet haben, die
Ihr Systemverwalter ihnen zubilligt, können Sie einen davon beenden,
ohne dazu einen weiteren Prozess mit /bin/kill starten zu
müssen. Die Eingabe von kill startet den in die
bash eingebauten kill-Befehl.
/bin/kill verwendet den externen kill-Befehl.
|
killall bewirkt im Prinzip dasselbe wie kill. Es sendet Signale an Prozesse. Der Unterschied zwischen
kill und killall ist, an
welchen Prozesse ein Signal gesendet wird. Bei killall wird
nicht die PID des Prozesses angegeben, sondern dessen Name. Da
allerdings der Name, im Gegensatz zur PID, nicht eindeutig ist,
wird das Signal an alle Prozesse mit diesem Namen gesendet.
Der genaue Aufruf lautet:
killall [Option] [Signal] <Name>
Wenn <Name> einen / enthält so ist damit
nicht der Name eines Prozesses gemeint, sondern der Name einer auszuführenden
Datei. Dabei wird ein Signal an alle Prozesse gesendet, die diese
Datei ausführen.
Die Signale sind dieselben wie bei kill. Ohne Angabe von
Signal wird auch ein SIGTERM (15) gesendet.
Eine wichtige Option ist -e (--exact). Normalerweise wertet
killall nur die ersten 15 Zeichen von
<Name> aus. Haben nun zwei Prozesse unterschiedliche
Namen stimmen aber trotzdem in den ersten 15 Zeichen überein, so sind
dennoch beide Prozesse von killall betroffen. Die Option
-e erzwingt dass der volle Name ausgewertet wird.
Eventuell will man nicht blind alle Prozesse mit gleichen Namen beenden,
sondern vorher noch eine Nachfrage haben. Dafür gibt es die Option
-i (--interactive).
|
|