|
|
| (29 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt) |
| Zeile 1: |
Zeile 1: |
| ===Was ist ein Prozess?===
| | *Animation zum Thema: [https://xinux.org/prozesse.html Prozesse] |
| Ein Prozess setzt sich aus zwei Teilen zusammen:
| |
|
| |
|
| 1.Programm, das in den Hauptspeicher geladen wurde
| | *[[Was ist ein Prozess?]] |
| | | *[[Prozesstabelle (Anzeige mit ps)]] |
| 2.Prozessumgebung
| | *[[Prozesse Eltern und Kinder]] |
| | | *[[Rechenzeit und Priorität]] |
| Unter einem Prozess versteht man ein Programm (binär), das in den Hauptspeicher
| | *[[Prozesse Signale]] |
| geladen wurde. Also nicht das Program selbst, das auf der Festplatte liegt ist der
| | *[[Programme im Zusammenhang mit Prozessen]] |
| Prozess, sondern es wird erst durch das Laden in den Hauptspeicher dazu.
| | *[[Jobs]] |
| Normalerweise liegt ein Programm als ausführbare Datei irgendwo auf der
| | *[[Forkbomb]] |
| Festplatte oder auf Diskette. Ob es sich bei dem Programm um eine binäre Datei
| |
| handelt, kann man mit dem Befehl '' file '' feststellen.
| |
|
| |
| root@zero:~# file /bin/mkdir
| |
| /bin/mkdir: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped
| |
| | |
| | |
| Die Datei liegt im Maschinencode vor und kann in den Hauptspeicher geladen
| |
| werden. Sobald dies geschehen ist, kann der Rechner diesen Maschinencode
| |
| abarbeiten (ausführen).
| |
| | |
| Da aber ein Programm nicht direkt auf die Hardware zugreifen soll, muss es vom
| |
| Betriebsystem kontrolliert werden. Das Betriebssystem liegt logisch gesehen
| |
| zwischen Hardware und Anwendung. Das Betriebssystem ordnet jedem Prozess
| |
| verschiedene Kenndaten zu, um die Prozesse verwalten zu können. Alle
| |
| Kenndaten, die einem Prozess zugeordnet sind, nennt man die
| |
| Prozessumgebung.Wenn man in der Shell ein Kommando eingibt, wird ein Prozess
| |
| kreiert. Natürlich ist die Shell selbst auch ein Prozess. Ein Prozess kann aber
| |
| genauso gut ein Serverprozess (Dienst) sein, z.B. Apache.
| |
| Ein wesentliches Merkmal eines Prozesses ist die Prozesskommunikation. Über im
| |
| Betriebssystem implementierte Methoden ist es möglich, dass verschiedene
| |
| Prozesse Signale und Daten untereinander austauschen können.
| |
| Dadurch wird auch dem Benutzer ermöglicht, einem Prozeß bestimmte Signale zu
| |
| senden bzw. auf den Status eines Prozesses Einfluss zu nehmen.
| |
| | |
| ===Prozesstabelle (Anzeige mit ps)===
| |
| Da zu jedem Prozess Kenndaten geführt werden, müssen diese auch irgendwo
| |
| festgehalten werden. Das geschieht in der sogenannten Prozesstabelle.
| |
| | |
| Kenndaten der Prozesse (Auswahl):
| |
| * F Flags (z.B. ausgelagert; Systemprozess; Trace,...) | |
| * UID Nutzer, mit dessen Rechten der Prozess ausgeführt wird
| |
| * PID Prozess - ID. Diese Nummer gibt eine eindeutige Prozess - Nummer
| |
| an. Sie wird vom System automatisch beim Starten des Prozesses
| |
| vergeben und ist für die Laufzeit eindeutig.
| |
| * PPID Prozessnumer der Eltern-Prozesses
| |
| * PRI Priorität eines Prozesses; je niedriger der Wert ist, desto besser
| |
| * NI ist der Nicewert des Prozesses; Nice erniedrigt den Grundwert
| |
| der Priorität des Prozesses und gibt damit Prozessorzeit für andere
| |
| Prozesse frei. | |
| * SIZE Speichergröße des Prozesses inklusive Stack (eine Art Zwischenspeicher)
| |
| * RSS Verbrauch an physischen Speicher
| |
| * WCHAN ist der Name der Kernerlfunktion, in der der Prozess schläft
| |
| * STAT Status des Prozesses
| |
| R läuft S schlafend D nicht störbarer Schlaf
| |
| T angehalten Z Zombie W der Prozess belegt keine Seiten
| |
| * TIME Bisland benötigte Prozessorzeit
| |
| * SIZE ist die Größe von Text, Daten und Stack
| |
| * TTY die Nummer des kontrollierenden Teminal; wenn hier ein ? steht,
| |
| handelt es sich um einen Dämon oder Serverprozess.
| |
| * COMMAND Angabe des Prozesses selbst. Dies ist meist der Programmname.
| |
| | |
| Weiteres
| |
| * GID Gruppe, unter der der Prozess läuft
| |
| * Verweis auf das aktuellen Arbeitsverzeichnis
| |
| * Um mit relativen Pfadangaben arbeiten zu können braucht man diesen Eintrag
| |
| * Tabelle mit Verweisen auf aktuell geöffnete Dateien
| |
| * 3 sind automatisch geöffnet Standardeingabe, Standardausgabe und
| |
| Standardfehlerkanal
| |
| | |
| Beispiel
| |
| root@zero:~# ps -l
| |
| F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
| |
| 4 R 0 18639 18631 0 80 0 - 1080 - pts/0 00:00:00 bash
| |
| 0 R 0 25904 18639 0 80 0 - 635 - pts/0 00:00:00 ps
| |
| | |
| ===Eltern und Kinder===
| |
| Jeder Prozess kann weitere Prozesse erzeugen. Die erzeugten Prozesse bezeichnet
| |
| man als Kindprozesse. Jeder Kindprozess weiß anhand der PID, woher er stammt.
| |
| | |
| Alle Prozesse sind von einem anderen Prozess gestartet worden, mit Ausnahme
| |
| des Pseudoprozesses (noch im Kernel beim Starten erzeugter Prozess). Dieser hat
| |
| die Prozessnummer 0. Er hat die Aufgabe, den Init Prozess ( /sbin/init die Nummer
| |
| 1) zu starten, der in System V alle anderen Prozesse direkt oder über seine Kind-
| |
| prozesse startet. (init wird konfiguriert durch die /etc/inittab)
| |
| | |
| Es gibt zwei Arten wie ein Prozess gestartet werden kann:
| |
| | |
| # Fork und Exec: Prozessumgebung wird dupliziert, der neue Prozess bekommt eine eigene neue PID
| |
| # Exec: Alter Prozess wird durch neuen Prozess überladen (geht mit dem shell-buildin exec)
| |
| | |
| '''Rechte auf Objekte UID GID'''
| |
| Ob ein Prozess auf eine Datei zugreifen kann, entscheidet der Kernel anhand der
| |
| Zugriffssrechte, die auf der Datei gesetzt sind. Er checkt anhand der UID und GID
| |
| des Prozesses, ob es erlaubt ist. Mit dieser Technik wird letztendlich geprüft, was
| |
| ein User darf, und was nicht.
| |
| | |
| ===Rechenzeit und Priorität===
| |
| Da auch bei Prozessen eine Gerechtigkeit herschen muss, muss eine Instanz
| |
| darüber entscheiden wie lange ein Prozess Rechenzeit verbrauchen darf.
| |
| Folgende Kenndaten werden dazu benötigt
| |
| * clocktick = Zeiteinheit
| |
| * n = Faktor über den Kernel einstellbar
| |
| * slice = n <nowiki>*</nowiki> clocktick
| |
| * agingtime = weitere Zeiteinheit über den Kernel einstellbar
| |
| | |
| Es wird davon ausgegangen das der Prozess mit der niedrigsten Priorität gerade
| |
| rechnet. Pro clocktick erhöht sich die Priorität dieses Prozesses um eins.
| |
| | |
| Jetzt können 3 Situationen eintreten die alle dazu führen das der Scheduler
| |
| aufgerufen wird.
| |
| | |
| # Prozess blockiert wegen einer Ausgabe oder Eingabe.
| |
| # Gibt Rechenzeit freiwillig ab.
| |
| # Der Slice endet.
| |
| | |
| Der Aufruf des Schedulers bewirkt das der Prozess mit der niedrigsten Priorität
| |
| gescheduled wird, er also nun rechnen darf. Nach Ablauf der agingtime werden
| |
| nun die Prozesse "gealtert". Das geschieht nach folgender Formel
| |
| | |
| Neue Priorität = Alte Priorität / 2 + Nicewert
| |
| | |
| Der User hat die Möglichkeit, über den sogenannten Nicewert den Grundwert für
| |
| einen Prozess zu senken. Der Prozess braucht dann länger für seine Abarbeitung.
| |
| Er verhält sich somit netter zu den anderen Prozessen. Normale User können nur
| |
| netter werden, der Systemverwalter kann auch nicht netter (gemeiner) werden. Der
| |
| Bereich liegt zwischen 19 (sehr nett) bis 0 (weniger nett) für die User, und 19 bis
| |
| -20 für root.
| |
| | |
| | |
| '''Signale'''
| |
| | |
| Mit den Kommando kill und killall kann man Prozessen Signale schicken
| |
| | |
| kill -Signalnummer PID
| |
| | |
| Signalnummer
| |
| {| border=1 cellpadding=2
| |
| !Signalname
| |
| !Wert
| |
| !Aktion
| |
| |-
| |
| |SIGHUP
| |
| |1
| |
| |Neuinitialisierung eines Prozesses
| |
| |-
| |
| |SIGINT
| |
| |2
| |
| |Interrupt-Signal von der Tastatur (STRG+c)
| |
| |-
| |
| |SIGQUIT
| |
| |3
| |
| |Interrupt-Signal von der Tastatur (STRG+c) mit Dump
| |
| |-
| |
| |SIGKILL
| |
| |9
| |
| |unwiderrufliches Beendigungssignal (Töten)
| |
| |-
| |
| |SIGSEGV
| |
| |11
| |
| |Ungültige Speicherreferenz (bedeutet oft auf defekten Speicher)
| |
| |-
| |
| |SIGTERM
| |
| |15
| |
| |Beendigungssignal (geöffnete Dateien werden geschlossen)
| |
| |-
| |
| |SIGCONT
| |
| |18
| |
| |Weiterfahren, wenn gestoppt
| |
| |-
| |
| |SIGSTOP
| |
| |19
| |
| |Prozessstop
| |
| |}
| |
| | |
| Beispiel
| |
| root@zero:~# kill -1 7562
| |
| | |
| ===Programme im Zusammenhang mit Prozessen===
| |
| ====ps: Zeigt die Prozesse mit ihrem Status an====
| |
| | |
| Option Beschreibung (BSD)
| |
| *l langes Format
| |
| *U user zeige Prozesse des Users an!
| |
| *u zeige für jeden Prozess Besitzer und Startzeit an
| |
| *j Jobs-Format: Zeige PGID und SID an
| |
| *s Informationen über Signale ausgeben
| |
| *m Speicher-Informationen anzeigen
| |
| *f Baumstruktur der Prozesse anzeigen (ähnlich pstree)
| |
| *a alle Prozesse (jedes Benutzers) anzeigen
| |
| *x kontrollierendes Terminal nicht anzeigen
| |
| *e Für den Prozess gültige Umgebungsvariablen mit anzeigen (sinnvollerweise mit mehreren Optionen »w« anwenden, um die Ausgabe nicht am Zeilenende abzuschneiden)
| |
| *w längere Ausgabe. »w« kann mehrfach verwendet werden, um die maximale Länge um je eine Zeile zu vergrößern
| |
| *h Header mit Feldbezeichnern unterdrücken
| |
| *r nur laufende Prozesse ausgeben
| |
| *n User-ID statt User-Name ausgeben
| |
| *txx nur Prozesse ausgeben, die vom angegebenen Terminal kontrolliert werden. xx kann entweder einer der Terminal-Gerätenamen unter /dev (z.B. tty1) oder die entsprechende Kurzbezeichnung ohne »tty« (z.B. 1) sein.
| |
| | |
| thomas@cardassia:~# ps
| |
| PID TTY TIME CMD
| |
| 14134 pts/0 00:00:00 bash
| |
| 14149 pts/0 00:00:00 ps
| |
|
| |
| root@zero:~# ps alx | grep apache
| |
| 5 33 1427 6710 20 0 13816 3064 skb_re S ? 0:00 /usr/sbin/apache2 -k start
| |
| 5 33 1428 6710 20 0 235672 3316 pipe_w Sl ? 0:00 /usr/sbin/apache2 -k start
| |
| 5 33 1429 6710 20 0 235672 3320 pipe_w Sl ? 0:00 /usr/sbin/apache2 -k start
| |
| 5 0 6710 1 20 0 14192 4460 select Ss ? 0:01 /usr/sbin/apache2 -k start
| |
| 0 0 13376 13244 20 0 3248 824 pipe_w S+ pts/13 0:00 grep apache
| |
| | |
| zeige Prozesse des Users an!
| |
| thomas@cardassia:~$ ps u zeige für jeden Prozess Besitzer und Startzeit an
| |
| USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
| |
| thomas 8758 0.0 0.0 7744 3068 pts/0 Ss 16:37 0:00 bash
| |
| thomas 10137 0.0 0.0 7728 2988 pts/1 Ss 16:45 0:00 bash
| |
| | |
| zeige Prozesse des Users und zeige für jeden Prozess Besitzer und Startzeit an
| |
| thomas@cardassia:~$ ps uU root
| |
| USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
| |
| root 1 0.0 0.0 3188 2060 ? Ss 16:24 0:01 /sbin/init
| |
| root 2 0.0 0.0 0 0 ? S< 16:24 0:00 [kthreadd]
| |
| root 3 0.0 0.0 0 0 ? S< 16:24 0:00 [migration/0]
| |
| | |
| ====pgrep: Zeigt die PID zu einem Prozess an====
| |
| *zeigt alle Prozesse an die auf die das Muster
| |
| root@zero:~# pgrep mc
| |
| 13552
| |
| 13734
| |
| *zeigt nur die an die einem User gehören
| |
| root@zero:~# pgrep -u thomas mc
| |
| 13552
| |
| zeigt denn vollständigen Prozessnamen an
| |
| root@zero:~# pgrep -l apa
| |
| 1427 apache2
| |
| 1428 apache2
| |
| 1429 apache2
| |
| 6710 apache2
| |
| zeigt den zuletzt gestarteten Prozess
| |
| root@zero:~# pgrep -n apa
| |
| 1429
| |
| zeigt nur Prpzesse an die genau auf den Namen passen
| |
| root@zero:~# pgrep -x apache2
| |
| 1427
| |
| 1428
| |
| 1429
| |
| 6710
| |
| ====pkill: schickt einem Prozess anhand des Namens ein Signal====
| |
| beendet den Prozess
| |
| root@zero:~# pkill -x apache2
| |
| beendet den Prozess der als erstes gestartet wurde
| |
| root@zero:~# pkill -xo mc
| |
| | |
| ====nice: Lässt ein Programm mit verändertem Grundwert der Priorität laufen====
| |
| root@zero:~# nice
| |
| 0
| |
| root@zero:~# nice -n 9 bash
| |
| root@zero:~# nice
| |
| 9
| |
| root@zero:~#
| |
| | |
| ====renice: Ändert den Grundwert der Priorität eines laufenden Prozesses====
| |
| root@zero:~# renice 10 5742
| |
| 5742: Alte Priorität: 0, neue Priorität: 10
| |
| | |
| ====top: Zeigt die Prozesse mit ihrem Status an (Abbrechen mit q)====
| |
| root@zero:~# top
| |
| top - 08:51:08 up 20 min, 1 user, load average: 0.00, 0.02, 0.06
| |
| Tasks: 93 total, 1 running, 92 sleeping, 0 stopped, 0 zombie
| |
| Cpu(s): 1.6%us, 3.1%sy, 0.1%ni, 84.9%id, 10.2%wa, 0.0%hi, 0.2%si, 0.0%st
| |
| Mem: 509504k total, 273948k used, 235556k free, 11312k buffers
| |
| Swap: 321260k total, 0k used, 321260k free, 118380k cached
| |
|
| |
| PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
| |
| 2208 mysql 20 0 125m 21m 5552 S 1.7 4.2 0:02.29 mysqld
| |
| 3201 root 20 0 2444 1064 828 R 1.7 0.2 0:00.04 top
| |
| 1 root 20 0 1908 780 564 S 0.0 0.2 0:02.19 init
| |
| 2 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kthreadd
| |
| 3 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0
| |
| 4 root 15 -5 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/0
| |
| 5 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
| |
| 6 root 15 -5 0 0 0 S 0.0 0.0 0:00.04 events/0
| |
| 7 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 khelper
| |
| 8 root RT -5 0 0 0 S 0.0 0.0 0:00.00 kstop/0
| |
| 9 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kintegrityd/0
| |
| 10 root 15 -5 0 0 0 S 0.0 0.0 0:00.03 kblockd/0
| |
| 11 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kacpid
| |
| 12 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kacpi_notify
| |
| 13 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 cqueue
| |
| 14 root 15 -5 0 0 0 S 0.0 0.0 0:00.53 ata/0
| |
| 15 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 ata_aux
| |
| | |
| Kommandos
| |
| | |
| *h - Hilfe
| |
| *u - User
| |
| *k - Kill
| |
| *r - Renice
| |
| *d - Delay (Default 3s)
| |
| *n - Tasks (Default unbegrenzt)
| |
| *W - Schreibe aktuelle Konfiguration in Datei
| |
| *q - Quit
| |
| | |
| ====pstree: Zeigt die Prozesse als Baumstruktur====
| |
| Mit -p werden auch die PID's ausgegeben
| |
| root@zero:~# pstree
| |
| init─┬─NetworkManager
| |
| ├─acpid
| |
| ├─apache2───5*[apache2]
| |
| ├─atd
| |
| ├─bluetoothd
| |
| ├─console-kit-dae───63*[{console-kit-dae}]
| |
| ├─cron
| |
| ├─cupsd
| |
| ├─dbus-daemon
| |
| ├─dd
| |
| ├─gdm───gdm─┬─Xorg
| |
| │ └─gdmgreeter
| |
| ├─6*[getty]
| |
| ├─hald───hald-runner─┬─hald-addon-acpi
| |
| │ ├─hald-addon-inpu
| |
| │ └─2*[hald-addon-stor]
| |
| ├─klogd
| |
| ├─nm-system-setti
| |
| ├─nmbd
| |
| ├─nscd───11*[{nscd}]
| |
| ├─portmap
| |
| ├─rpc.statd
| |
| ├─slapd───2*[{slapd}]
| |
| ├─smbd───smbd
| |
| ├─sshd───sshd───bash───bash───pstree
| |
| ├─syslogd
| |
| ├─system-tools-ba
| |
| ├─udevd
| |
| ├─winbindd─┬─winbindd───winbindd
| |
| │ └─3*[winbindd]
| |
| └─wpa_supplicant
| |
| | |
| ===Jobs===
| |
| Unter einem Job versteht man ein Programm, welches man von der Shell gelöst
| |
| hat. D. h. man kann ganz normal weiter arbeiten und der Job verrichtet seinen
| |
| Dienst im Hintergrund. Man kann jederzeit zu diesem Job wieder Kontakt
| |
| aufnehmen.
| |
| | |
| Ein Job kann auf 2 Arten gestarten werden:
| |
| | |
| # Durch Anhängen des & Zeichens beim Programmstart
| |
| root@zero:~# tail -f /var/log/messages &
| |
| Jun 19 06:59:31 zero -- MARK --
| |
| Jun 19 07:19:31 zero -- MARK --
| |
| Jun 19 07:39:32 zero -- MARK --
| |
| Jun 19 07:44:57 zero syslogd 1.5.0#5ubuntu3: restart.
| |
| Jun 19 07:59:32 zero -- MARK --
| |
| Jun 19 08:19:32 zero -- MARK --
| |
| Jun 19 08:39:32 zero -- MARK --
| |
| Jun 19 08:59:32 zero -- MARK --
| |
| Jun 19 09:19:33 zero -- MARK --
| |
| Jun 19 09:39:33 zero -- MARK --
| |
| [3] 27421
| |
| | |
| # Durch Stoppen des Prozesses durch Drücken von Strg-Z und in den Hintergrund schicken mit %n (n ist die Jobnummer)
| |
| root@zero:~# watch cat /proc/cpuinfo
| |
| Strg-Z
| |
| [4]+ Stopped watch cat /proc/cpuinfo
| |
| root@zero:~# bg %4
| |
| [4]+ watch cat /proc/cpuinfo &
| |
| | |
| Anweisungen im Zusammenhang mit Jobs (n ist die Jobnummer)
| |
| * bg %n : Einen Job in den Hintergrund stellen (wie oben)
| |
| * fg %n : Einen Job in den Vordergrund holen
| |
| root@zero:~# fg %4
| |
| watch cat /proc/cpuinfo
| |
| | |
| * jobs : Aktive Jobs ausgeben
| |
| | |
| root@zero:~# jobs
| |
| [1] Running tail -f /var/log/syslog &
| |
| [2] Running tail -f /var/log/syslog &
| |
| [3]- Running tail -f /var/log/messages &
| |
| [4]+ Stopped watch cat /proc/cpuinfo
| |
| | |
| * Strg-Z : Einen Vordergrund-Job vorübergehend anhalten
| |
| * kill -STOP %n : Unterbricht Job im Hintergrund | |
| root@zero:~# kill -STOP %1
| |
| root@zero:~# jobs
| |
| [1]+ '''Stopped''' tail -f /var/log/syslog
| |
| [2] Running tail -f /var/log/syslog &
| |
| [3] Running tail -f /var/log/messages &
| |
| [4]- Stopped watch cat /proc/cpuinfo
| |
| * kill -CONT %n : Setzt den unterbrochenen Job im Hintergrund fort | |
| root@zero:~# kill -CONT %1
| |
| root@zero:~# jobs
| |
| [1]+ '''Running''' tail -f /var/log/syslog &
| |
| [2] Running tail -f /var/log/syslog &
| |
| [3] Running tail -f /var/log/messages &
| |
| [4]- Stopped watch cat /proc/cpuinfo
| |
| * kill -KILL %n : Tötet Job im Hintergrund
| |
| root@zero:~# kill -KILL %1
| |
| root@zero:~# jobs
| |
| [1]+ '''Killed''' tail -f /var/log/syslog
| |
| [2] Running tail -f /var/log/syslog &
| |
| [3] Running tail -f /var/log/messages &
| |
| [4]- Stopped watch cat /proc/cpuinfo
| |
| root@zero:~# jobs
| |
| [2] Running tail -f /var/log/syslog &
| |
| [3]- Running tail -f /var/log/messages &
| |
| [4]+ Stopped watch cat /proc/cpuinfo
| |
| | |
| Bedingungen, die zu Jobausführung eingehalten werden sollen:
| |
| * Der Job soll nicht auf den Bildschirm schreiben (Standardausgabe +Standardfehlerkanal).
| |
| * Er soll keine Eingaben vom Benutzer erwarten.
| |