Linux/Prozesse/Prozess erstellen: Unterschied zwischen den Versionen

Aus Foxwiki
Thomaskarras (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
K Textersetzung - „Man-Pages“ durch „Man-Page“
 
(17 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
[[Category:Linux:Prozessmanagement:Prozess erstellen]]
= Wie wird eine 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.


== Wie wird eine Prozess generiert ==
Der exec() Aufruf hat seinen Weg auch in den Funktionsumfang der in die Shell eingebauten Kommandos gefunden:
1. und wie sieht sein weiterer Weg aus?
exec ls
login:


    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.
'''Erklärung'''
    Erst mit dem Aufruf von exec() wird ein Prozess das alte Programm durch ein neues ersetzen und dessen Ausführung beginnen.
* Im Beispiel wurde das Programm des laufenden Prozesses durch das Kommando ls ersetzt.
    Der exec() Aufruf hat seinen Weg auch in den Funktionsumfang der in die Shell eingebauten Kommandos gefunden:
* 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.


exec ls
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:
login:
sleep 100
# 100 Sekunden verstreichen, die Shell wartet...


1.1. Erklärung
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
    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[Enter]
  Die Eingabe muss mittels [Ctrl]-[D] beendet
  Die Eingabe muss mittels [Ctrl]-[D] beendet
Zeile 31: Zeile 25:
  [Ctrl]-[C]  
  [Ctrl]-[C]  


Anmerkung 'Das reguläre Beenden eines Prozesses kann auf verschiedenen Wegen erfolgen. '
'''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


    In obigem Beispiel ist das Programm cat eigentlich dazu gedacht, aus einer Datei zu lesen, und beendet sich, sobald das Dateiende erreicht ist.
# Start eines Hintergrundprozesses, der Eingaben erwartet
    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.
(ls -Rl >/dev/null; cat)&
    Dies erfolgt mit dem End-of-File-Zeichen (kurz EOF), das auf der Tastatur mit der Tastenkombination [Ctrl]-[D] generiert wird.
[1] 720
    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.
[Enter]
    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
[1]+  Stopped      (ls $LS_OPTIONS -Rl >/dev/null; cat)
(ls -Rl >/dev/null; cat)&
fg
[1] 720
(ls $LS_OPTIONS -Rl >/dev/null; cat)
[Enter]
hallo[Enter]
hallo
[Ctrl]-[D]


[1]+  Stopped      (ls $LS_OPTIONS -Rl >/dev/null; cat)
* Jedes im Hintergrund laufende Programm wird als Job bezeichnet.
fg
* 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.
(ls $LS_OPTIONS -Rl >/dev/null; cat)
* Diese beinhaltet in eckigen Klammern eine fortlaufende, von der Shell vergebene Jobnummer und die vom System dem Prozess zugeordnete Prozessnummer (PID).
hallo[Enter]
hallo
[Ctrl]-[D]


    Jedes im Hintergrund laufende Programm wird als Job bezeichnet.
Mit dem Kommando jobs kann man Informationen über die derzeit auf einer Shell laufenden Hintergrundprozesse erlangen:
    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.
cat &
    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] 1343
   
   
Zeile 84: Zeile 81:
  [1]+  Stopped            cat
  [1]+  Stopped            cat
  exit
  exit
# Shell wurde beendet
# Shell wurde beendet
 
= Links =
== Dateien ==
 
== Man-Page ==
 
== Intern ==
 
== Weblinks ==
 
[[Kategorie:Linux/Prozesse]]

Aktuelle Version vom 6. November 2024, 12:29 Uhr

Wie wird eine 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: 

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

Links

Dateien

Man-Page

Intern

Weblinks