Ihr Root-Server ist manchmal mehr und manchmal weniger ausgelastet. Verglichen mit der Dampflokomotive im Bild ist es gar nicht so einfach zu sagen, wie ausgelastet das System nun ist. Bei der Lokomotive sieht man den Dampf, bei Ihren PC zuhause hören Sie vielleicht den Lüfter surren, aber bei einem Root-Server in einem Rechenzentrum?
Um einen Überblick über die aktuelle Auslastung zu bekommen gibt es zwei Kommandos: ps und top.
Heute schauen wir uns ps an.
ps
Das Kommando ps erzeugt eine Liste von Prozessen. Der Name ps ist die Abkürzung von process status.
Stellt sich die Frage: Was ist überhaupt ein Prozess?
Zunächst mal ist ein Prozess ein Vorgang, der durch ein Programm kontrolliert wird, das zur Ausführung einen Prozessor benötigt. Zu einem Prozess gehören auch die notwendigen Daten im zugewiesenen Adressraum, die Inhalte von CPU Registern, wenn der Prozess ausgeführt wird und die Systemdaten (Metadaten), die das Betriebssystem aus seiner Sicht über den Prozess speichert, beispielsweise die laufende Nummer des Prozesses, die Startzeit, die verbrauchte CPU Zeit und den aktuellen Status des Prozesses. Das Kommando ps kann alle Metadaten aller Prozesse anzeigen.
Zu den laufenden Prozessen, die von ps angezeigt werden, gehören auch sogenannte Zombie Prozesse. Ein Zombie Prozess ist ein beendeter Prozess, der aber trotzdem noch in der Prozesstabelle auftaucht und Systemressourcen belegt.
Beispiel für einen Zombie Prozess:
Wenn Sie Ihren Apache Webserver automatisch bei einem Neustart des Rechners starten lassen, aber beim TLS Zertifikat ein Passwort verlangen, das per Hand eingeben werden muss, so führt dies zu einem Zombie Prozess. Der Webserver versucht zu starten, kann aber nicht, weil das Passwort fehlt. Sie können die Aufforderung nicht sehen, weil Sie die Konsolenmeldungen normalerweise nicht sehen.
Ausser den Zombie Prozessen gibt es noch verwaiste Prozesse.
Ein Prozess kann einen neuen Prozess starten. Man nennt diese Kombination Eltern-Kind Prozesse.
Beispiel für einen verwaisten Prozess:
Wir bleiben beim Apache Webserver. Wenn der Webserver gestartet wird startet damit normalerweise ein einzelner Steuerprozess. Wenn nun viele Besucher die Websites besuchen, die der Apache Webserver ausliefert, startet dieser Steuerprozess zusätzliche Kind-Prozesse um mehr Systemressourcen verwalten zu können und schneller auf Anfragen zu reagieren. Wenn die Last nachlässt und/oder der Webserver neugestartet wird, müssen alle Kind-Prozesse wieder beendet werden. Normalerweise klappt das gut, aber manchmal bleibt einer der Kind-Prozesse aus unterschiedlichsten Gründen erhalten. Dieser Waise hat keinen Eltern-Prozess mehr und kann zu erheblichen Problemen im System führen, weil einfach nicht berechenbar ist, was passieren kann.
Aber lassen Sie uns zunächst die Ausgaben des Befehls etwas näher ansehen.
Parameter
Das Kommando ps kann mit unterschiedlichen Parametern aufgerufen werden. Diese Parameter können auch kombiniert werden.
l – Langes Format
novatrend@server1:~$ ps l F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 0 1000 2352 2351 20 0 26912 7980 wait Ss pts/0 0:00 -bash 0 1000 2450 2449 20 0 12676 1220 wait Ss+ pts/1 0:00 bash -c cd /srv/pump.io; npm start 0 1000 2451 2450 20 0 964624 35396 ep_pol Sl+ pts/1 0:00 npm 0 1000 2457 2451 20 0 4448 660 wait S+ pts/1 0:00 sh -c ./bin/pump 0 1000 2458 2457 20 0 674584 37712 ep_pol Sl+ pts/1 0:00 node ./bin/pump 0 1000 2460 2458 20 0 859432 66768 ep_pol Sl+ pts/1 0:01 /usr/bin/nodejs /srv/pump.io/bin/pump 0 1000 4642 2352 20 0 10240 1004 - R+ pts/0 0:00 ps l
u – User Format (Mit User und Startzeit)
novatrend@server1:~$ ps u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND novatre+ 2352 0.0 0.3 26912 7980 pts/0 Ss 11:00 0:00 -bash novatre+ 2450 0.0 0.0 12676 1220 pts/1 Ss+ 11:01 0:00 bash -c cd /srv/pump.io; npm start novatre+ 2451 0.0 1.7 964624 35396 pts/1 Sl+ 11:01 0:00 npm novatre+ 2457 0.0 0.0 4448 660 pts/1 S+ 11:01 0:00 sh -c ./bin/pump novatre+ 2458 0.0 1.8 674584 37712 pts/1 Sl+ 11:01 0:00 node ./bin/pump novatre+ 2460 0.0 3.2 859432 66768 pts/1 Sl+ 11:01 0:01 /usr/bin/nodejs /srv/pump.io/bin/pump novatre+ 4651 0.0 0.0 18672 1212 pts/0 R+ 15:47 0:00 ps u
a – Alle Prozesse, auch die anderer User
Hier werden auch die TTY-Prozesse angezeigt. TTY bezeichnet das Text-Terminal aus dem der Prozess gestartet wurde. Linux hat normalerweise sechs Text-Terminals, auch virtuelle Konsolen oder Terminalemulationen genannt, an denen man sich anmelden kann.
novatrend@server1:~$ ps a PID TTY STAT TIME COMMAND 743 tty4 Ss+ 0:00 /sbin/getty -8 38400 tty4 746 tty5 Ss+ 0:00 /sbin/getty -8 38400 tty5 751 tty2 Ss+ 0:00 /sbin/getty -8 38400 tty2 752 tty3 Ss+ 0:00 /sbin/getty -8 38400 tty3 755 tty6 Ss+ 0:00 /sbin/getty -8 38400 tty6 1975 tty1 Ss+ 0:00 /sbin/getty -8 38400 tty1 2352 pts/0 Ss 0:00 -bash 2450 pts/1 Ss+ 0:00 bash -c cd /srv/pump.io; npm start 2451 pts/1 Sl+ 0:00 npm 2457 pts/1 S+ 0:00 sh -c ./bin/pump 2458 pts/1 Sl+ 0:00 node ./bin/pump 2460 pts/1 Sl+ 0:01 /usr/bin/nodejs /srv/pump.io/bin/pump 4668 pts/0 R+ 0:00 ps a
x – Auch Daemon-Prozesse (Ohne eigene TTY-Leitung)
Daemon Prozesse sind so etwas wie der Webserver Prozess. Diese Prozesse werden normalerweise mit Root-Rechten gestartet und tauchen hier nicht auf. Wenn Sie den Befehl mit root Rechten aufrufen sudo ps x, sehen Sie auch die Daemon Prozesse
novatrend@server1:~$ sudo ps x [sudo] password for novatrend: PID TTY STAT TIME COMMAND 1 ? Ss 0:01 /sbin/init 2 ? S 0:00 [kthreadd] ... 1441 ? S 0:00 /bin/bash /usr/share/apache2/ask-for-passphrase serverblogger.ch:443 RSA 1918 ? Ss 0:00 /usr/sbin/apache2 -k start 1975 tty1 Ss+ 0:00 /sbin/getty -8 38400 tty1 2303 ? Ss 0:00 sshd: novatrend [priv] 4129 ? S< 0:00 [kworker/u3:1] 4800 pts/0 S+ 0:00 sudo ps x 4801 pts/0 R+ 0:00 ps x
f – Forest (Wald) Format – Der Prozessbaum wird dargestellt
Hier sieht man gut die Eltern und Kind Struktur.
novatrend@server1:~$ ps f PID TTY STAT TIME COMMAND 2450 pts/1 Ss+ 0:00 bash -c cd /srv/pump.io; npm start 2451 pts/1 Sl+ 0:00 \_ npm 2457 pts/1 S+ 0:00 \_ sh -c ./bin/pump 2458 pts/1 Sl+ 0:00 \_ node ./bin/pump 2460 pts/1 Sl+ 0:01 \_ /usr/bin/nodejs /srv/pump.io/bin/pump 2352 pts/0 Ss 0:00 -bash 4686 pts/0 R+ 0:00 \_ ps f
w – Wide (breite) Ausgabe – Zeilen werden nicht abgeschnitten
Hat in diesem Fall keinen Effekt, da die Zeilen relativ kurz sind
novatrend@server1:~$ ps w PID TTY STAT TIME COMMAND 2352 pts/0 Ss 0:00 -bash 2450 pts/1 Ss+ 0:00 bash -c cd /srv/pump.io; npm start 2451 pts/1 Sl+ 0:00 npm 2457 pts/1 S+ 0:00 sh -c ./bin/pump 2458 pts/1 Sl+ 0:00 node ./bin/pump 2460 pts/1 Sl+ 0:01 /usr/bin/nodejs /srv/pump.io/bin/pump 4687 pts/0 R+ 0:00 ps w
Ausgabe einschränken
Hier ein Beispiel für alle Prozesse, auch die anderer User und die Daemon Prozesse, mit dem Komando grep gefiltert auf Apache. In diesem erhalten wir keine Überschrift, da nur die Zeile, die den String „apache“ enthalten, ausgegeben werden.
novatrend@server1:~$ sudo ps ax | grep apache 1441 ? S 0:00 /bin/bash /usr/share/apache2/ask-for-passphrase serverblogger.ch:443 RSA 1918 ? Ss 0:00 /usr/sbin/apache2 -k start 1928 ? S 0:20 /usr/sbin/apache2 -k start 1929 ? S 0:20 /usr/sbin/apache2 -k start 1988 ? S 0:19 /usr/sbin/apache2 -k start 2126 ? S 0:19 /usr/sbin/apache2 -k start 2127 ? S 0:19 /usr/sbin/apache2 -k start 2129 ? S 0:19 /usr/sbin/apache2 -k start 2132 ? S 0:20 /usr/sbin/apache2 -k start 2299 ? S 0:19 /usr/sbin/apache2 -k start 2300 ? S 0:19 /usr/sbin/apache2 -k start 2302 ? S 0:19 /usr/sbin/apache2 -k start 4809 pts/0 S+ 0:00 grep --color=auto apache
Die 10 Prozesse, die am meisten Speicher benötigen
ps -auxf | sort -nr -k 4 | head -10
Die 10 Prozesse, die am meisten CPU Zeit benötigen
ps -auxf | sort -nr -k 3 | head -10
Ausgabe verstehen und einordnen
Am Beispiel des u – Parameters (Mit User und Startzeit) gehe ich mal die Ausgabe durch
novatrend@server1:~$ ps u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND novatre+ 2352 0.0 0.3 26912 7980 pts/0 Ss 11:00 0:00 -bash novatre+ 2450 0.0 0.0 12676 1220 pts/1 Ss+ 11:01 0:00 bash -c cd /srv/pump.io; npm start novatre+ 2451 0.0 1.7 964624 35396 pts/1 Sl+ 11:01 0:00 npm
- User: Der Benutzername der den Prozess gestartet hat
- PID: Prozess-ID
- %CPU: Auslastung der CPU. Der Wert ist die gesamte CPU Zeit geteilt durch die Laufzeit des Prozesses ausgedrückt als Prozentzahl (Auf dem Testserver ist also wenig los 🙂 )
- %MEM. Das Verhältnis zwischen den vom Prozess genutzen Speicher und dem gesamten Speicher der Maschine ausgedrückt in Prozent
- VSZ: Die Grösse des virtuellen Speichers in KiloBytes.
- RSS: Die Grösse des residenten Speichers in KiloBytes.
- TTY: Terminal von dem aus der Prozess aufgerufen wurde
- STAT: Der Status des Prozesses. D für uninterruptable sleep (wartet auf Eingabe), R für running (laufend), S für sleeping (schlafend), T für traced (angehalten), X für dead (tot) und Z für einen Zombie-Prozess. In unserem Fall steht da Ss, Ss+ und Sl+. Das grosse S steht dafür, dass diese Prozesse schlafen, das kleine sagt aus, dass diese Prozesse ein session leader Prozesse sind (also potentielle Eltern). Das + Zeichen steht für einen Prozess der im Vordergrund läuft, das l für einen multi-threaded Prozess
- START: Die Zeit, wann der Prozess gestartet wurde. Je nachdem, wie lange der Zeitpunkt her ist, wird er in Minuten, Stunde oder Tagen angegeben.
- TIME: Die CPU Zeit, die dieser Prozess bisher „verbraucht“ hat
- COMMAND: Das ist die Programmzeile, mit der der Prozess aufgerufen worden ist
Die wirklich gute und komplette Übersicht über die einzelnen Parameter, Ausgaben und deren Bedeutungen gibt die die Handbuchseite des Debian Projekts – http://manpages.debian.org/cgi-bin/man.cgi?query=ps
Was kann ich mit den Prozessen machen?
Ich kann mit den Prozessen kommunizieren indem ich Ihnen Signale schicke. Dazu bietet Linux Befehle wie kill, skill, renice und viele andere mehr.
kill
Wie der Name schon andeutet, geht es darum einen Prozess zu beenden. Um ihn zu nutzen, muss ich die Prozess-ID kennen. Allerdings weiss ich als Administrator nicht, wie das Programm auf verschiedene Parameter des kill Befehls reagieren wird, da die Reaktion abhängig von der Programmierung ist. Einzig das Signal 9 ist festgelegt und beendet einen Prozess. Der Befehl, der einen Prozess beendet lautet also
kill -9 [pid]
skill
In diesem Fall brauche ich keine Prozess-ID sondern den Namen von Benutzern, Programmen oder TTY Leitungen.
skill -9 [name]
renice
Der nice Wert gibt die Priorität von Prozessen im Bereich von -20 bis 19 an.
renice 15 -p 5678
verändert beispielsweise die Priorität des Prozesses mit der pid 5678 auf 15.
Interprozesskommunikation
Unter Interprozesskommunikation versteht man alle Methoden zum Informationsaustausch zwischen Prozessen. Da geht es um solche Buzzwords wie Multitasking, Multithreading, Shared memory, Pipes und Datenströme im Allgemeinen.
Im Grunde geht es also um fast alles, was mit Betriebssystemen zu tun hat. Und der Befehl ps listet all diese Prozesse auf. Zum Glück werden Sie vermutlich nur den „kill -9“ Befehl hin- und wieder brauchen
tl;dr: Der Befehl ps bietet Ihnen eine Übersicht über alle Prozesse Ihres Systems.
Schreibe einen Kommentar