Ein laufendes Betriebssystem besteht aus Prozessen. Diese Prozesse werden in einer bestimmten Reihenfolge ausgeführt und sind miteinander verknüpft. Es gibt zwei Kategorien von Prozessen, die sich auf die Benutzerumgebung und auf die Hardware-Umgebung konzentrieren.
Wenn ein Programm läuft, startet das System einen Prozess, indem es die Programmdaten und den Programmcode im Speicher platziert und einen Runtime-Stack erstellt. Ein Prozess ist daher eine Instanz eines Programms mit der dazugehörigen Prozessorumgebung (Ordinalzähler, Register, usw...) und Speicherumgebung.
Jeder Prozess wird durch Folgendes charakterisiert:
eine PID: Process IDentifier, ein eindeutiger Prozess-Identifikator;
PPID: Parent Prozess IDentifikator, eindeutige Kennung des Elternprozesses.
Durch aufeinanderfolgende Vererbung ist der init-Prozess der Vater aller Prozesse.
Ein Prozess wird immer von einem übergeordneten Prozess abgeleitet;
Ein übergeordneter Prozess kann mehrere Child-Prozesse haben.
Es gibt eine Parent-/Child-Beziehung zwischen Prozessen. Ein Kindprozess ist das Ergebnis des Elternprozesses, der die Primitive fork() aufruft und seinen eigenen Code dupliziert, um ein Kind zu erstellen. Die PID des Kindes wird an den Elternprozess zurückgegeben, damit es mit ihm kommunizieren kann. Jedes Kind hat eine Eltern-Identifikation, die PPID.
Die PID-Nummer repräsentiert den Prozess zum Zeitpunkt der Ausführung. Wenn der Prozess beendet ist, steht die Nummer für einen anderen Prozess wieder zur Verfügung. Wenn Sie den gleichen Befehl mehrmals ausführen, wird jedes Mal eine andere PID-Nummer erzeugt.!!! note "Anmerkung"
Prozesse dürfen nicht mit _threads_ verwechselt werden. Jeder Prozess hat seinen eigenen Speicher-Kontext (Ressourcen und Adressraum), während _threads_ aus demselben Prozess diesen Kontext gemeinsam teilen.
Wenn ein Kommando ausgeführt wird, werden die Zugangsdaten des Benutzers an den erzeugten Prozess übergeben.
Standardmäßig sind die aktuelle UID und GID (des Prozesses) daher identisch mit der tatsächlichenUID und GID (die UID und GID des Benutzers, der den Befehl ausgeführt hat).
Wenn eine SUID (und/oder SGID) für einen Befehl gesetzt wird, wird die tatsächliche UID (und/oder GID) die des Eigentümers (und/oder der Eigentümergruppe) des Befehls und nicht mehr die des Benutzers oder der Benutzergruppe, die den Befehl ausgelöst hat. Effektive und echte UIDs sind daher verschieden.
Jedes Mal, wenn auf eine Datei zugegriffen wird, prüft das System die Rechte des Prozesses anhand seiner effektiven Identifikatoren.
Ein Prozess kann nicht auf unbestimmte Zeit ausgeführt werden, da dies zu Lasten anderer laufender Prozesse würde und Multitasking verhindern würde.
Die gesamte Bearbeitungszeit ist daher in kleine Bereiche unterteilt und jeder Prozess (mit einer Priorität) greift sequenziell auf den Prozessor zu. Der Prozess wird mehrere Zustände während seiner Ausführung durchlaufen:
ready: Warten auf die Verfügbarkeit des Prozesses;
in execution: Zugriff auf den Prozessor;
suspended: Warten auf I/O (Eingabe/Ausgabe);
stopped: Warte auf ein Signal von einem anderen Prozess;
zombie: Anfrage zur Zerstörung
dead: Der Parent-Prozesse beendet den Child-Prozess.
Das Ende vom Prozesss läuft wie folgt ab:
Schließen der offenen Dateien;
Freigabe des verwendeten Speichers;
Ein Signal an die Eltern- und Kindprozesse senden.
Wenn ein Elternprozess nicht mehr existiert, werden seine Kinder als Orphan bezeichnet. Sie werden dann durch den init-Prozess übernommen, der sie beendet.
synchronous: Der Benutzer verliert den Zugriff auf die Shell während der Ausführung des Befehls. Die Eingabeaufforderung erscheint am Ende der Prozessausführung wieder.
asynchronous: Der Prozess wird im Hintergrund verarbeitet. Die Eingabeaufforderung wird sofort wieder angezeigt.
Die Einschränkungen des asynchronen Modus:
der Befehl oder das Skript darf nicht auf die Eingabe der Tastatur warten;
der Befehl oder das Skript darf kein Ergebnis auf dem Bildschirm zurückgeben;
Der kill Befehl sendet ein Stoppsignal an einen Prozess.
kill [-signal] PID
Beispiel:
$ kill -9 1664Unterbreche den Prozess (STRG + D)
15SIGTERM
Bereinigung und Beenden des Prozesses
18SIGCONT
Prozess fortsetzen
19SIGSTOP
Prozess anhalten
Signale sind das Mittel der Kommunikation zwischen den Prozessen. Der kill Befehl sendet ein Signal an einen Prozess.
!!! tip "Hinweis"
Die komplette Liste der Signale, die vom `kill` Befehl unterstüzt werden, kann durch folgendes Kommando ausgegeben werden:
$ man 7 signal
nohup Befehl
nohup erlaubt das Starten eines Prozesses unabhängig von einer Verbindung.
nohup Befehl
Beispiel:
$ nohup myprogram.sh 0</dev/null &
Durch nohup wird das SIGHUP Signal ignoriert, das gesendet wird, wenn ein Benutzer sich ausloggt.
!!! note "Hinweis"
`nohup` behandelt Standard-Ausgabe und -Fehler, aber keine Standardeingabe, daher die Umleitung dieser Eingabe nach `/dev/null`.
[CTRL] + [Z]
Durch gleichzeitiges Drücken der STRG + Z Tasten wird der Synchronprozess vorübergehend unterbrochen. Der Zugriff auf die Eingabeaufforderung wird wiederhergestellt, nachdem die Nummer des gerade unterbrochenen Prozesses angezeigt wurde.
& Anweisung
Die Anweisung & führt den Befehl asynchron aus (der Befehl wird dann job genannt) und zeigt die Id-Nummer vom job an. Der Zugriff auf die Eingabeaufforderung wird zurückgestellt.
Beispiel:
$ time ls -lR / > list.ls 2> /dev/null &
[1] 15430
$
Die Job-Nummer wird während der Hintergrundverarbeitung abgerufen und in eckigen Klammern angezeigt, gefolgt von der PID-Nummer.
fg und bg Befehle
Der fg Befehl stellt den Prozess in den Vordergrund:
$ time ls -lR / > list.ls 2>/dev/null &
$ fg 1
time ls -lR / > list.ls 2/dev/null
während der Befehl bg ihn im Hintergrund platziert:
[CTRL]+[Z]
^Z
[1]+ Stopped
$ bg 1
[1] 15430
$
Ob es im Hintergrund gesetzt wurde, als es mit dem & Argument erstellt wurde oder später mit den STRG +Z Tasten erstellt wurde, kann ein Prozess mit dem Befehl fg und seiner Jobnummer wieder in den Vordergrund gebracht werden.
jobs Befehl
Der Befehl jobs zeigt die Liste der im Hintergrund laufenden Prozesse an und gibt deren Jobnummer an.
die Reihenfolge in der die Prozesse ausgeführt werden
ein + : Dieser Prozess ist der nächste Prozess, der standardmäßig mit fg oder bg ausgeführt wird;
ein - : Dieser Prozess ist der nächste Prozess, der die + übernimmt +
Running (laufender Prozess) oder Stopped (abgehängter Prozess)
der Kommando
nice und renice Befehle
Der Befehl nice erlaubt die Ausführung eines Befehls, wobei seine Priorität angegeben wird.
nice priority command
Beispiel:
$ nice -n+15 find / -name "file"
Anders als root kann ein Standardbenutzer die Priorität eines Prozesses nur reduzieren. Nur Werte zwischen +0 und +19 werden akzeptiert.
!!! tip "Hinweis"
Diese letzte Einschränkung kann pro Benutzer oder pro Gruppe aufgehoben werden, indem die Datei `/etc/security/limits.conf` geändert wird.
Mit dem renice Befehl können Sie die Priorität eines laufenden Prozesses ändern.
renice priority [-g GID] [-p PID] [-u UID]
Beispiel:
$ renice +15 -p 1664
Option
Beschreibung
-g
GID der Prozessbesitzer-Gruppe.
-p
PID des Prozesses.
-u
UID des Prozess-Owner.
Der renice Befehl wirkt auf bereits laufende Prozesse. Es ist daher möglich, die Priorität eines bestimmten Prozesses, aber auch mehrerer Prozesse zu ändern, die einem Benutzer oder einer Gruppe angehören.
!!! tip "Hinweis"
Der `pidof`-Befehl, kombiniert mit dem `xargs` Befehl (siehe den Kurs über erweiterte Befehle), erlaubt es, eine neue Priorität in einem einzigen Befehl anzuwenden:
$ pidof sleep | xargs renice 20
top Befehl
Der top Befehl zeigt die Prozesse und den Ressourcenverbrauch an.
$ Top
PID USER PR NI ... %CPU %MEM TIME+ COMMAND
2514 root 20 0 15 5.5 0:01.14 top
Spalte
Beschreibung
PID
Prozess IDentifikationsnummer.
USER
Besitzer.
PR
Prozesspriorität.
NI
Nice-Wert.
%CPU
Prozessorlast
%MEM
Speicherauslastung.
TIME+
Prozessor-Nutzungszeit.
COMMAND
Befehl ausgeführt.
Der top Befehl erlaubt die Kontrolle der Prozesse in Echtzeit und im interaktiven Modus.
pgrep und pkill Befehle
Der pgrep Befehl durchsucht die laufenden Prozesse nach einem Prozessnamen und zeigt auf der Standardausgabe die PID an, die den Auswahlkriterien entspricht.
Der Befehl pkill sendet das angegebene Signal (standardmäßig SIGTERM) an jeden Prozess.