Diskussion:Linux/Prozesse: Unterschied zwischen den Versionen

Aus Foxwiki
Thomaskarras (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
K Dirkwagner verschob die Seite Diskussion:Linux:Prozesse nach Diskussion:Linux/Prozesse, ohne dabei eine Weiterleitung anzulegen: Textersetzung - „Linux:“ durch „Linux/“
 
(16 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
== Ohne direkten Kontakt ==
== nohup ==  
- Prozess abnabeln


    Die bisher vorgestellten Fälle betrachteten nur die Möglichkeit, Programme während einer Sitzung parallel von einer Shell aus zu starten, und im Hintergrund ablaufen zu lassen.
nohup    COMMAND [ARG]...  
    Interessant ist aber auch der Weg, Programme auf der Shell zu starten, und diese nach dem Abmelden, sprich dem Beenden der benutzten Shell, weiter laufen zu lassen.
    Bisher waren in allen Beispielen die gestarteten Programme an die aufrufende Shell gebunden. So dass bei Beendigung selbiger auch die an sie gebundenen Prozesse den Aufruf zum Beenden erhalten.
    Um Programme von der Shell abzukoppeln, wird das Kommando nohup verwendet.
    Dieses schirmt das Programm vom HUP-Signal der Shell ab, so dass es nach dem Beenden der Shell unabhängig weiter laufen kann:


nohup ls -lR / >/dev/null &
    Das von nohup gestartete Kommando läuft unabhängig von der aktiven Shell. D.h. ein so gestartetes Kommando arbeitet auch nach dem Beenden der Sitzung (logout) weiter.
[1] 2511
    Die Ausgaben von nohup werden ggf. in eine Datei nohup.out umgeleitet. Kann diese im aktuellen Verzeichnis nicht erzeugt werden, wird sie im Heimatverzeichnis angelegt.
ps -ef | grep 2511
    Scheitert auch dies, beendet nohup seine Tätigkeit.
user     2511 2502 20 00:28 tty5    00:00:02 ls -lR /
     Ein über nohup gestartetes Kommando erhält eine um 5 erhöhte Priorität.
  user    2514  2502  0 00:28 tty5    00:00:00 grep 2511
 
bash
  ./sleepproc&
  [1] 776
  exit
  exit
ps eax | grep spleepproc
   
   
  ...auf einer anderen oder neuen Shell:
  bash
  Have a lot of fun...
nohup ./sleepproc&
  ps -ef | grep 2511
[1] 786
  user    2511    1 14 00:28 ?       00:00:05 ls -lR /
  exit
user     2524  2516  0 00:29 tty5   00:00:00 grep 2511
  ps eax | grep spleepproc
  786 ? S N 0:00 sh ./sleepproc...
 
Anmerkung
 
    Im Beispiel wird in einer Subshell ein Skript "sleepproc" gestartet und die Shell beendet.
    Wie zu erwarten war, wurde der in der Shell gestartete Prozess mit dem Ende der Shell beendet.
     In einem zweiten Schritt wird das Skript "sleepproc" unabhängig von der Shell gestartet... es existiert auch nach Beendigung der Shell weiter.
 
== nohup ==
- Prozess abnabeln
 
nohup   COMMAND [ARG]...


nohup startet das Programm nicht selbstständig im Hintergrund.
    Das von nohup gestartete Kommando läuft unabhängig von der aktiven Shell. D.h. ein so gestartetes Kommando arbeitet auch nach dem Beenden der Sitzung (logout) weiter.
    Die Ausgaben von nohup werden ggf. in eine Datei nohup.out umgeleitet. Kann diese im aktuellen Verzeichnis nicht erzeugt werden, wird sie im Heimatverzeichnis angelegt.
    Scheitert auch dies, beendet nohup seine Tätigkeit.
    Ein über nohup gestartetes Kommando erhält eine um 5 erhöhte Priorität.


    So ist es möglich, ein Programm analog zum »normalen« Vorgehen (ohne »nohup«) zu starten, eventuell notwendige Eingaben vorzunehmen und erst im Anschluss das Programm durch Eingaben von [Ctrl]-[Z] und nachfolgendem bg in den Hintergrund zu schicken.
bash
    Erst jetzt existiert der das Programm ausführende Prozess tatsächlich abgenabelt von seinem Vorfahren.
./sleepproc&
    Ein Prozess, der keine Eingaben benötigt, lässt sich bequem durch ein der Kommandozeile nachgestelltes & unverzüglich vom Elternprozess entkoppeln.
  [1] 776
    Und welche Möglichkeiten bleiben mir nun, um solch einen Prozess nachträglich zu beeinflussen?
exit
    Eine direkte Verbindung zum Terminal wie bei fg ist nicht mehr möglich. Hier hilft nur noch eine indirekte Kommunikation über Signale, die u.a. mit dem Kommando kill übermittelt werden können:
ps eax | grep spleepproc
dd if=/dev/zero of=/dev/null &
  [1] 20098
   
   
  ps -axuw | grep 20098
  bash
  user    20098 30.5  0.3  1204  448 pts/4    R    11:49  0:36 dd if=/dev/zero of=/dev/null
  nohup ./sleepproc&
kill -19 20098
  [1] 786
  ps -axuw | grep 20098
  exit
user    20098 75.9  0.3  1204  448 pts/4    T    11:49  1:01 dd if=/dev/zero of=/dev/null
  ps eax | grep spleepproc
  kill -18 20098
  786 ? S N 0:00 sh ./sleepproc...
  ps -axuw | grep 20098
  user    20098 55.5  0.3  1204  448 pts/4    R    11:49  1:54 dd if=/dev/zero of=/dev/null
kill -15 20098


Erläuterung
Anmerkung


     Das Kommando »dd« (zum »Low-Level«-Kopieren) wird im Hintergrund gestartet. Dass es aktiv ist, bestätigt das »R« (running) in der Ausgabe des Kommandos ps. In einer weiteren Eingabe wird dem Prozess die Aufforderung zum Stoppen signalisiert (Signal Nr. 19).
     Im Beispiel wird in einer Subshell ein Skript "sleepproc" gestartet und die Shell beendet.
     Dass es tatsächlich funktioniert hat, beweist nun das »T« (traced oder gestoppt) in der »ps«-Ausgabe.
     Wie zu erwarten war, wurde der in der Shell gestartete Prozess mit dem Ende der Shell beendet.
     Mit dem Signal 18 schließlich wird der Prozess reaktiviert; das »R« ist wieder in der Ausgabe zu sehen.
     In einem zweiten Schritt wird das Skript "sleepproc" unabhängig von der Shell gestartet... es existiert auch nach Beendigung der Shell weiter.
    Damit unser Beispielkommando nicht für alle Zeit die Nullen in den Mülleimer befördert, brechen wir es mit dem Signal 15 (Aufforderung zum Beenden) ab.

Aktuelle Version vom 22. März 2023, 16:34 Uhr

nohup

- Prozess abnabeln

nohup COMMAND [ARG]...

   Das von nohup gestartete Kommando läuft unabhängig von der aktiven Shell. D.h. ein so gestartetes Kommando arbeitet auch nach dem Beenden der Sitzung (logout) weiter.
   Die Ausgaben von nohup werden ggf. in eine Datei nohup.out umgeleitet. Kann diese im aktuellen Verzeichnis nicht erzeugt werden, wird sie im Heimatverzeichnis angelegt.
   Scheitert auch dies, beendet nohup seine Tätigkeit.
   Ein über nohup gestartetes Kommando erhält eine um 5 erhöhte Priorität.

bash

./sleepproc&
[1] 776
exit
ps eax | grep spleepproc

bash
nohup ./sleepproc&
[1] 786
exit
ps eax | grep spleepproc
786 ? S N 0:00 sh ./sleepproc...

Anmerkung

   Im Beispiel wird in einer Subshell ein Skript "sleepproc" gestartet und die Shell beendet.
   Wie zu erwarten war, wurde der in der Shell gestartete Prozess mit dem Ende der Shell beendet.
   In einem zweiten Schritt wird das Skript "sleepproc" unabhängig von der Shell gestartet... es existiert auch nach Beendigung der Shell weiter.

nohup

- Prozess abnabeln

nohup COMMAND [ARG]...

   Das von nohup gestartete Kommando läuft unabhängig von der aktiven Shell. D.h. ein so gestartetes Kommando arbeitet auch nach dem Beenden der Sitzung (logout) weiter.
   Die Ausgaben von nohup werden ggf. in eine Datei nohup.out umgeleitet. Kann diese im aktuellen Verzeichnis nicht erzeugt werden, wird sie im Heimatverzeichnis angelegt.
   Scheitert auch dies, beendet nohup seine Tätigkeit.
   Ein über nohup gestartetes Kommando erhält eine um 5 erhöhte Priorität.

bash

./sleepproc&
[1] 776
exit
ps eax | grep spleepproc

bash
nohup ./sleepproc&
[1] 786
exit
ps eax | grep spleepproc
786 ? S N 0:00 sh ./sleepproc...

Anmerkung

   Im Beispiel wird in einer Subshell ein Skript "sleepproc" gestartet und die Shell beendet.
   Wie zu erwarten war, wurde der in der Shell gestartete Prozess mit dem Ende der Shell beendet.
   In einem zweiten Schritt wird das Skript "sleepproc" unabhängig von der Shell gestartet... es existiert auch nach Beendigung der Shell weiter.