Aktion beendet
Die Änderungen von Dirkwagner (Diskussion | Beiträge) wurden rückgängig gemacht und die letzte Version von Thomaskarras (Diskussion | Beiträge) wurde wiederhergestellt.
Zurück zur Seite Foxwiki:Artikel:Erstellen.
Zeile 1: | Zeile 1: | ||
== Wie wird ein Prozess generiert == | |||
und wie sieht sein weiterer Weg aus? | |||
Die beiden wesentlichen Aktionen bei der Prozessentstehung sind die Systemaufrufe '''fork'''() und '''exec'''(). Mittels '''fork'''() wird ein neuer Prozess erzeugt, der zunächst dasselbe Programm wie sein Elternprozess ausführt. | |||
Erst mit dem Aufruf von '''exec'''() wird ein Prozess das alte Programm durch ein neues ersetzen und dessen Ausführung beginnen. | |||
Der '''exec'''() Aufruf hat seinen Weg auch in den Funktionsumfang der in die Shell eingebauten Kommandos gefunden: | |||
exec ls | |||
login: | |||
1.2.1.1 Erklärung | |||
Im Beispiel wurde das Programm des laufenden Prozesses durch das Kommando '''ls''' ersetzt. | |||
Da der aktive Prozess die Shell selbst ist, wird diese beendet und nachdem nun auch '''ls''' seine Tätigkeit abgeschlossen hat, finden wir uns auf der Login-Konsole wieder (sofern es sich um die Login-Shell selbst handelte). | |||
'''fork'''() existiert nicht als eigenständiges Kommando. Eine Shell wird diesen Systemruf immer tätigen, um ein Programm innerhalb eines neuen Prozesses auszuführen. | |||
Eine Shell vermag (fast) beliebig viele Prozesse zu starten, jedoch wartet sie in den häufigsten Fällen auf die Terminierung des zuletzt gestarteten Prozesses: | |||
'''sleep''' 100 | |||
# 100 Sekunden verstreichen, die Shell wartet... | |||
Uns als Anwender steht es nun zu, einem Prozess zu signalisieren, dass er sich z.B. regulär beenden [Ctrl]-[D] , ist i.A. programmabhängig) oder seine Verarbeitung abbrechen ([Ctrl]-[C]) soll: | |||
'''cat''' | |||
Die Eingabe muss mittels [Ctrl]-[D] beendet[Enter] | |||
Die Eingabe muss mittels [Ctrl]-[D] beendet | |||
oder mit [Ctrl]-[C] abgebrochen werden[Enter] | |||
oder mit [Ctrl]-[C] abgebrochen werden | |||
[Ctrl]-[C] | |||
= | Anmerkung 'Das reguläre Beenden eines Prozesses kann auf verschiedenen Wegen erfolgen. ' | ||
[[ | |||
In obigem Beispiel ist das Programm '''cat''' eigentlich dazu gedacht, aus einer Datei zu lesen, und beendet sich, sobald das Dateiende erreicht ist. | |||
Wird jedoch von der Standardeingabe eingelesen, und ist diese wie in diesem Fall mit der Tastatur verbunden, so muss der Nutzer dem Programm signalisieren, dass das »Dateiende« erreicht wurde. | |||
Dies erfolgt mit dem End-of-File-Zeichen (kurz '''EOF'''), das auf der Tastatur mit der Tastenkombination [Ctrl]-[D] generiert wird. | |||
In solchen Fällen bestünde keine Möglichkeit, beliebig viele Prozesse quasi-parallel zu starten, da der soeben initiierte Prozess die Shell für weitere Eingaben blockiert. | |||
Die Lösung des Problems liegt im Verschieben des Prozesses in den Hintergrund. | |||
Dabei wird er von der Ein- und Ausgabe der Shell abgekoppelt und läuft im Hintergrund weiter, bis er sich selbst beendet, oder aber auf Grund einer notwendigen Interaktion mit dem Benutzer zum Anhalten gezwungen ist. | |||
# Start eines Hintergrundprozesses, der keine Eingaben erwartet | |||
ls -lR > /dev/null & | |||
[1] 706 | |||
"beliebiges Arbeiten auf der Kommandozeile" [Enter] | |||
[1]+ Done ls $LS_OPTIONS -lR >/dev/null | |||
# Start eines Hintergrundprozesses, der Eingaben erwartet | |||
(ls -Rl >/dev/null; cat)& | |||
[1] 720 | |||
[Enter] | |||
[1]+ Stopped (ls $LS_OPTIONS -Rl >/dev/null; cat) | |||
fg | |||
(ls $LS_OPTIONS -Rl >/dev/null; cat) | |||
hallo[Enter] | |||
hallo | |||
[Ctrl]-[D] | |||
Jedes im Hintergrund laufende Programm wird als Job bezeichnet. | |||
Nach Beendigung der Eingabe des Kommandos mit [Enter] gibt die Bash auf der Standardfehlerausgabe eine Zeile mit Jobinformationen aus, wie am Beispiel zu erkennen ist. | |||
Diese beinhaltet in eckigen Klammern eine fortlaufende, von der Shell vergebene Jobnummer und die vom System dem Prozess zugeordnete Prozessnummer (PID). | |||
Mit dem Kommando jobs kann man Informationen über die derzeit auf einer Shell laufenden Hintergrundprozesse erlangen: | |||
cat & | |||
[1] 1343 | |||
[1]+ Stopped cat | |||
time dd count=1000000 if=/dev/zero of=/dev/null & | |||
[2] 1346 | |||
jobs | |||
[1]+ Stopped cat | |||
[2]- Running time dd count=1000000 if=/dev/zero of=/dev/null & | |||
1000000+0 Records ein | |||
1000000+0 Records aus | |||
real 0m13.817s | |||
user 0m9.430s | |||
sys 0m4.040s | |||
[2]- Done time dd count=1000000 if=/dev/zero of=/dev/null | |||
exit | |||
exit | |||
There are stopped jobs. | |||
jobs | |||
[1]+ Stopped cat | |||
exit | |||
# Shell wurde beendet | |||
[[Categorie: Linux: Prozessverwaltung]] |