Prozesse E-Mail
Geschrieben von: tpm   

Quasi jede Arbeit die Linux durchführt ist ein Prozess. Sei es ein laufendes Programm, die Eingabekonsole oder ein einfacher Verzeichniswechsel. Zu den Aufgaben eines Administrators gehört es nun die effiziente Auslastung eines Systems sicherzustellen und darunter fällt eben auch die Prozessüberwachung.

 

Nicht erst bei einem erheblichen Performancemangel sollte man als Verantwortlicher reagieren. Bei einem stets belastetem System lassen sich potentielle Mängel, bzw. aufkommende Probleme oft vermeiden. Dazu gehört eine regelmäßige Kontrolle der Prozesse.

  1. überwachen
  2. potentielle Mängel identifizieren
  3. reagieren / beseitigen
  4. überwachen (1.)

Zur Prozessüberwachung gibt es zwar komfortable und effektive Applikationen, aber auch Linux bringt von sich aus effizente und aussagekräftige Programme mit sich, welche im Folgenden genauer betrachtet werden.

Mit dem Programm top lassen sich laufende Prozesse anzeigen und die Anzeige wird ständig aktuallisiert:

 

input
top

 

output
top - 10:57:12 up 7 days, 10:21,  1 user,  load average: 1.82, 0.60, 0.20
Tasks: 46 total, 1 running, 45 sleeping, 0 stopped, 0 zombie
Cpu(s): 27.0%us, 0.7%sy, 0.0%ni, 72.1%id, 0.2%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 4194304k total, 1056028k used, 3138276k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 0k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
32104 pace 15 0 720m 385m 2796 S 221.9 9.4 3:21.07 handbrake
3613 pace 15 0 12604 1200 928 R 0.3 0.0 0:00.03 top
1 root 18 0 10344 732 616 S 0.0 0.0 0:13.73 init
1392 root 15 0 315m 19m 10m S 0.0 0.5 0:34.98 httpd
1637 pace 15 0 76268 3648 2584 S 0.0 0.1 0:00.04 in.proftpd
1652 named 19 0 156m 3632 1848 S 0.0 0.1 0:03.47 named
10022 root 15 0 5904 604 484 S 0.0 0.0 0:21.30 syslogd
15981 apache 15 0 232m 7964 484 S 0.0 0.2 0:11.88 httpd

 

Dies ist ein Auszug mit max. 8 Prozessen. Die Anzahl der anzuzeigenden Prozesse wird mit n, gefolgt von der gewünschten Anzahl eingegeben. Mit h wird die Hilfe angezeigt, mit q wird das Programm top beendet. Alle Eingaben werden direkt übernommen!

Die einzelen Positionen:

  • PID = Programm ID (Diese werden vom System automatisch vergeben)
  • USER = Ausführender Benutzer des Prozesses (Bei systemrelevanten Prozessen automatisch root)
  • PR = Aktuelle Priorität des Prozesses (Dieser kann sich dem Anspruch entsprechend ändern)
  • NI = Gibt an, mit welcher Priorität der Prozess gestartet wurde (Dabei gilt: +<0<-)
  • VIRT = Der gesamte benutzte Speicher, incl. aller durch den Prozess benötigten Bibliotheken
  • RES = Angabe des belegten RAM (ohne Virtuellen Arbeitsspeicher)
  • SHR = Im Speicher befindliche Daten, die gemeinsam genutzt werden
  • S = Status (D=Deep Sleeping, R=Running, S=Sleeping, T=Traced, W=Waiting, Z=Zombie, Mischformen möglich)
  • %CPU = CPU Auslastung
  • % MEM = Memory Auslastung
  • TIME+ = Zeit in der der Prozess CPU Zeit in Anspruch genommen wurde (hh:mm:ss)
  • Command = Der Name des Prozesses (oft mit entsprechenden Parametern)

Eine weitere Möglichkeit ist der Befehl ps mit seinen Optionen:

 

input
ps -lA

 

output
F S   UID   PID  PPID  C PRI  NI ADDR    SZ WCHAN  TTY          TIME CMD
5 S 48 17528 1392 0 75 0 - 80813 - ? 00:00:00 httpd
4 S 0 18275 1 0 82 0 - 2981 - ? 00:00:00 mysqld_safe
4 S 27 19570 18275 0 75 0 - 40789 stext ? 00:01:26 mysqld
5 S 0 20417 1 0 75 0 - 26998 - ? 00:00:28 spamd
5 S 110 21770 20417 0 75 0 - 26998 - ? 00:00:00 spamd
4 S 0 22362 1 0 77 0 - 13533 - ? 00:00:01 master
4 S 89 22365 22362 0 75 0 - 13564 - ? 00:00:00 qmgr
5 S 48 23876 1392 0 75 0 - 80813 - ? 00:00:00 httpd
1 S 0 23925 1 0 75 0 - 5217 - ? 00:00:02 crond
5 S 43 24133 1 0 78 0 - 5205 - ? 00:00:00 xfs
0 S 503 24159 30538 99 75 0 - 168443 stext pts/1 00:01:43 handbrake
5 S 0 24178 1 0 75 -4 - 3150 - ? 00:00:00 udevd
5 S 0 24280 1 0 78 0 - 4683 - ? 00:00:00 atd
1 S 0 24297 1 0 78 0 - 11682 - ? 00:00:00 saslauthd
1 S 0 24339 24297 0 78 0 - 11682 - ? 00:00:00 saslauthd
4 S 89 24426 22362 0 78 0 - 13548 - ? 00:00:00 tlsmgr
1 S 0 24511 1 0 78 0 - 12175 - ? 00:00:06 miniserv.pl
0 R 503 27855 32023 0 77 0 - 2157 - pts/2 00:00:00 ps
4 S 0 29720 30515 0 75 0 - 23628 - ? 00:00:00 sshd
5 R 503 29752 29720 0 75 0 - 23628 - ? 00:00:00 sshd
0 S 503 29757 29752 0 80 0 - 3015 wait pts/0 00:00:00 bash

 

Die einzelen Positionen:

  • F =
  • UID = User ID (Äquivalent zum Benutzernamen)
  • PPID = Die Prozess-ID des Vaterprozesses
  • C =
  • ADDR =
  • NI =
  • SZ =
  • WCHAN =
  • TTY = Untere Gerätenummer des TTYs

Die letzte hier vorgestellete Möglichkeit zur Prozessanzeige ist pstree. Damit lassen sich Prozesse in Abhänigkeit zu übergeordneten Prozessen darstellen.

 

input
pstree

 

output
init---atd
+-4*[courierlogger]
+-4*[couriertcpd]
+-crond
+-cupsd
+-httpd---3*[httpd]
+-master---pickup
¦ +-qmgr
¦ +-tlsmgr
+-miniserv.pl
+-mysqld_safe---mysqld---8*[{mysqld}]
+-named---10*[{named}]
+-pcscd---{pcscd}
+-saslauthd---saslauthd
+-screen---bash---handbrake---9*[{handbrake}]
¦ +-bash---pstree
+-spamd---spamd
+-sshd---sshd---sshd---bash---screen
+-sw-cp-serverd
+-syslogd
+-udevd
+-xfs
+-xinetd---in.proftpd

 

Ein gutes Beispiel ist hier der Prozess screen, ein Programm zur Nutzung mehrerer Shells das nur vom Mutterprozess init abhängig ist. In diesem Programm wurden zwei Eingabeaufforderungen (bash) geöffnet, wobei in einem ein Konvertierungsprogramm (handbrake) läuft und im anderen das Programm pstree, welches für die obige Ausgabe verantwortlich ist.

 

Nun kommt es aber auch vor, dass ein Prozess nicht ordnungsgemäß beendet werden kann oder man möchte einen Prozess aus anderen Gründen beenden. Im Falle eines Programms in der Eingabeaufforderung wäre der erste Versuch das Programm mit der Abbruchsequenz Strg+c zu beenden. Damit lassen sich die meißten Prozesse die auf der Shell laufen sofort beenden.

Nun gibt es aber viele Hintergrundprozesse und denen wird man mit der Tastenkombination nicht habhaft. Dann greift man zum Befehl kill. Als Beispiel sei hier das fiktive Szenario gegeben, dass sich der Befehl top nicht mehr beenden lässt. Auf der Shell hat man dieses Bild:

 

example
top - 13:15:27 up 2 min, 1 user, load average: 0.03, 0.03, 0.00
Tasks: 81 total, 2 running, 79 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1036672k total, 92588k used, 944084k free, 4948k buffers
Swap: 2931820k total, 0k used, 2931820k free, 47512k cached

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+   COMMAND
1   root  15  0 1944 644 552 S  0.0  0.1 0:00.88 init
2   root  RT  0    0   0   0 S  0.0  0.0 0:00.00 migration/0
3   root  34 19    0   0   0 S  0.0  0.0 0:00.00 ksoftirqd/O
4   root  10 -5    0   0   0 S  0.0  0.0 0:00.02 events/0
5   root  10 -5    0   0   0 S  0.0  0.0 0:00.00 khelper

 

Nun wird auf eine andere Shell Session gewechselt. Beispielweise durch Alt+F2 und sich dort eingeloggt. Dann muss man die Prozess-ID des Programms in Erfahrung bringen.

 

input
ps -A |grep 'top'

 

output
5435 pts/0 00:00:00 top

 

In diesem Fall wird für das Programm top die Prozess-ID 5435 ausgegeben, welche es zu beenden gilt.

 

input
kill -15 5435

 

Wechseln man nun mit Alt+F1 wieder auf die erste Shell, steht man wieder am Eingabe Prompt.

Durch die obige Eingabe ist das Kommando kill -15 5435 abgesendet worden. Dies hätte man auch ohne die Option -15 eingeben können, denn dies ist die Default Option von kill. Die verfügbaren Optionen lassen sich mit der Option -l anzeigen.

 

input
kill -l

 

output
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPPIPE    14) SIGALRM     15) SIGTERM     17) SIGCHLD
18) SIGCONT     19) SIGSTOP     20) SIGTSTP     21) SIGTTIN
22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFS Z
26) SIGVTALRM   27) IGPROF      28) SIGUINCH    29) SIGIO
30) SIGPUR      31) SIGSYS      35) SIGRTMIN    36) SIGRTMIN+1
37) SIGRTMIN+2  38) SIGRTMIN+3  39) SIGRTMIN+4  40) SIGRTMIN+5
41) SIGRTMIN+6  42) SIGRTMIN+7  43) SIGRTMIN+8  44) SIGRTMIN+9
45) SIGRTMIN+10 46) SIGRTMIN+11 47) SIGRTMIN+12 48) SIGRTMIN+13
49) SIGRTMIN+14 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8
57) SIGRTMAX-7  58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4
61) SIGRTMAX-3  62) SIGRTMAX-2  63) SIGRTMAX-1  64) SIGRTMAX

 

Die Option 15 beinhaltet SIGTERM. Diese Option weißt dem Prozess an, sich ordnungsgemäß zu beenden. Gerade deshalb ist es auch die "Default Option" von kill.

Die Holzhammermethode wäre die Option 9, also SIGKILL. Damit wird der Prozess sofort beendet. Es versteht sich von selbst, dass diese Option nur im Notfall angewandt werden sollte, da sie unweigerlich zu Datenverlust führt.

Eine weitere interessante Option ist SIGHUP. Diese Option wird oft bei Prozessen eingesetzt, deren Konfigurationsdatei bearbeitet wurde. Durch SIGHUP werden sie aufgefordert sich neu zu starten und dabei ihre Konfigurationsdatei neu einzulesen.

Grundsätzlich lässt sich zwischen 2 Arten von Signalen unterscheiden. Signale die vom Prozess ignoriert werden können (z.B. SIGTERM) und die, die eben zwingend durchgeführt werden (z.B. SIGKILL). Genau genommen beeinflusst man auch nicht das Verhalten der Prozesse direkt, sondern veranlasst den Kernel eben dieses Verhalten sicherzustellen.

Zuletzt aktualisiert am Samstag, den 19. September 2009 um 16:40 Uhr