|
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.
- überwachen
- potentielle Mängel identifizieren
- reagieren / beseitigen
- ü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:
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:
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.
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:
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.
In diesem Fall wird für das Programm top die Prozess-ID 5435 ausgegeben, welche es zu beenden gilt.
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.
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. |