|
|
| (14 dazwischenliegende Versionen von 2 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==
| |
| *Programm, das in den Hauptspeicher geladen wurde | |
| *Prozessumgebung
| |
| ==Was versteht man unter einem Prozess==
| |
| *Ein Programm (binär), das in den Hauptspeicher geladen wurde.
| |
| *Ein Programm wird erst durch das Laden in den Hauptspeicher zu einem Prozess.
| |
| *Normalerweise liegt ein Programm als ausführbare Datei irgendwo auf der Festplatte.
| |
| *Ob es sich bei dem Programm um eine binäre Datei handelt, kann man mit dem Befehl '' file '' feststellen.
| |
| ==file==
| |
| *file /bin/ls
| |
| /bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=6461a544c35b9dc1d172d1a1c09043e487326966, for GNU/Linux 3.2.0, stripped
| |
|
| |
|
| | | *[[Was ist ein Prozess?]] |
| *Die Datei liegt im Maschinencode vor und kann in den Hauptspeicher geladen werden. | | *[[Prozesstabelle (Anzeige mit ps)]] |
| *Sobald dies geschehen ist, kann der Rechner diesen Maschinencode abarbeiten (ausführen).
| | *[[Prozesse Eltern und Kinder]] |
| *Da aber ein Programm nicht direkt auf die Hardware zugreifen soll, muss es vom Betriebsystem kontrolliert werden.
| | *[[Rechenzeit und Priorität]] |
| *Das Betriebssystem liegt logisch gesehen zwischen Hardware und Anwendung.
| | *[[Prozesse Signale]] |
| *Das Betriebssystem ordnet jedem Prozess verschiedene Kenndaten zu, um die Prozesse verwalten zu können.
| | *[[Programme im Zusammenhang mit Prozessen]] |
| *Alle Kenndaten, die einem Prozess zugeordnet sind, nennt man die Prozessumgebung. | | *[[Jobs]] |
| *Wenn man in der Shell ein Kommando eingibt, wird ein Prozess kreiert.
| | *[[Forkbomb]] |
| *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
| |
| * 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 PPID, 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
| |
| * kill -1 7562
| |
| | |
| ===Programme im Zusammenhang mit Prozessen===
| |
| ====ps: Zeigt die Prozesse mit ihrem Status an====
| |
| | |
| *[[ps]]
| |
| | |
| ====pgrep: Zeigt die PID zu einem Prozess an====
| |
| *zeigt alle Prozesse an die auf die das Muster
| |
| * pgrep mc
| |
| 13552
| |
| 13734
| |
| *zeigt nur die an die einem User gehören
| |
| * pgrep -u thomas mc
| |
| 13552
| |
| zeigt denn vollständigen Prozessnamen an
| |
| * pgrep -l apa
| |
| 1427 apache2
| |
| 1428 apache2
| |
| 1429 apache2
| |
| 6710 apache2
| |
| zeigt den zuletzt gestarteten Prozess
| |
| * pgrep -n apa
| |
| 1429
| |
| zeigt nur Prozesse an die genau auf den Namen passen
| |
| * pgrep -x apache2
| |
| 1427
| |
| 1428
| |
| 1429
| |
| 6710
| |
| ====pkill: schickt einem Prozess anhand des Namens ein Signal====
| |
| beendet den Prozess
| |
| *pkill -x apache2
| |
| beendet den Prozess der als erstes gestartet wurde
| |
| *pkill -xo mc
| |
| | |
| ====nice: Lässt ein Programm mit verändertem Grundwert der Priorität laufen====
| |
| *nice
| |
| 0
| |
| * nice -n 9 bash
| |
| * nice
| |
| 9
| |
| *
| |
| | |
| ====renice: Ändert den Grundwert der Priorität eines laufenden Prozesses====
| |
| * renice 10 5742
| |
| 5742: Alte Priorität: 0, neue Priorität: 10
| |
| | |
| ====top: Zeigt die Prozesse mit ihrem Status an (Abbrechen mit q)====
| |
| * 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
| |
| * 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
| |
| *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)
| |
| *watch cat /proc/cpuinfo | |
| Strg-Z
| |
| [4]+ Stopped watch cat /proc/cpuinfo
| |
| *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
| |
| * fg %4
| |
| watch cat /proc/cpuinfo
| |
| | |
| * jobs : Aktive Jobs ausgeben
| |
| | |
| *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
| |
| * kill -STOP %1
| |
| * 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
| |
| * kill -CONT %1
| |
| * 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
| |
| * kill -KILL %1
| |
| * 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
| |
| * 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.
| |