Zum Inhalt springen

Linux/Prozess/Hintergrund: Unterschied zwischen den Versionen

Aus Foxwiki
 
Zeile 53: Zeile 53:
Wenn Sie Ihre Shell-Sitzung beenden, wird den Prozessen häufig ein SIGHUP-Signal gesendet
Wenn Sie Ihre Shell-Sitzung beenden, wird den Prozessen häufig ein SIGHUP-Signal gesendet
* Bei Prozessen, die Sie im Hintergrund gestartet haben, bedeutet dies, dass der Prozess unweigerlich abgeschossen wird
* Bei Prozessen, die Sie im Hintergrund gestartet haben, bedeutet dies, dass der Prozess unweigerlich abgeschossen wird
{| class="wikitable"
|'''Hinweis  ''' Beim Testen auf verschiedenen Systemen ist mir allerdings aufgefallen, dass dieser Effekt nicht überall auftrat
* Bei SuSE 9.1 bspw
* liefen nach der Abmeldung und dem Anmelden die Hintergrundprozesse immer noch
* Im Gegensatz dazu wurde bei einem Solaris-System der Kind-Prozess (hier der Hintergrundprozess) beim Beenden der laufenden Shell mitgerissen und beendet
|}


Somit scheint diese Schwierigkeit ein wenig system- bzw. distributionsabhängig zu sein
Somit scheint diese Schwierigkeit ein wenig system- bzw. distributionsabhängig zu sein

Aktuelle Version vom 21. Dezember 2025, 00:08 Uhr

Hintergrundprozess

Hervorholen

Hintergrundprozess hervorholen

Was ein Hintergrundprozess ist und wie Sie einen solchen starten können, wurde bereits beschrieben

  • Der Vorteil eines Hintergrundprozesses ist, dass der laufende Prozess die Shell nicht mehr blockiert
  • Allerdings ist es auch nicht mehr möglich, die Standardeingabe bei Hintergrundprozessen zu verwenden
  • Die Standardeingabe wird hierbei einfach ins Datengrab (/dev/null) gelenkt

Zwar können Sie den Inhalt einer Datei umlenken

 kommando < file &

aber sobald hier etwas von der Tastatur gelesen werden soll, hält der Prozess an und wartet korrekterweise auf eine Eingabe

Beispiel
 printf "Eingabe machen : "
 read
 echo "Ihre Eingabe lautet $REPLY"

Führen Sie dieses Script jetzt im Hintergrund aus, passiert Folgendes:

 ./bg1 &
 [1] 7249
 Eingabe machen :
 [1]+  Stopped                 ./bg1

Das Script wird angehalten, denn es wartet ja auf eine Eingabe von der Tastatur

  • Ein Blick auf die laufenden Prozesse mit ps bestätigt dies auch:
 7249 pts/41   T      0:00 /bin/bash

Ein gestoppter Prozess hat das T (traced) in der Prozessliste stehen

  • Damit Sie diesen Prozess jetzt weiterarbeiten lassen können, müssen Sie ihn in den Vordergrund holen

Dies können Sie mit dem Kommando fg %1 (für foreground) erreichen

 fg %1
 ./bg1
 hallo
 Ihre Eingabe lautet hallo
 you@host >

Genaueres zu fg (und zum Gegenstück bg) erfahren Sie in Abschnitt 8.7, wenn es um die Jobverwaltung geht

Schützen

Hintergrundprozess schützen

Wenn Sie Ihre Shell-Sitzung beenden, wird den Prozessen häufig ein SIGHUP-Signal gesendet

  • Bei Prozessen, die Sie im Hintergrund gestartet haben, bedeutet dies, dass der Prozess unweigerlich abgeschossen wird

Somit scheint diese Schwierigkeit ein wenig system- bzw. distributionsabhängig zu sein

  • Sofern Sie das Problem haben, dass Prozesse, die im Hintergrund laufen, beendet werden, wenn sich der Benutzer ausloggt oder ein Eltern-Prozess an alle Kind-Prozesse das Signal SIGHUP sendet und diese somit beendet werden, können Sie das Kommando nohup verwenden
  • Allerdings scheint es auch hier wieder keine Einheitlichkeit zu geben, auf dem einen System ist nohup ein binäres Programm und auf den anderen wiederum ein einfaches Shellscript, welches das Signal 1 (SIGHUP) mit trap auffängt
Syntax
nohup Kommando [Argument ...]

Natürlich wird mit der Verwendung von nohup der Prozess hier nicht automatisch in den Hintergrund gestellt, sondern Sie müssen auch hier wieder am Ende der Kommandozeile das & setzen

Und das passiert, wenn Sie einen Prozess mit nohup in den Hintergrund schicken:

Der Prozess erhält ausreichend Priorität, um im Hintergrund zu laufen
  • Genauer, der Prozess wird bei nohup um den Prioritätswert 5 erhöht
Der Prozess wird vor dem SIGHUP-Signal geschützt
  • Gleiches könnten Sie auch realisieren, indem Sie mit trap das Signal 1 abfangen
Wenn das Kommando die Standardausgabe und Standardfehlerausgabe auf das laufende Terminal benutzt, so wird diese in die Datei nohup.out umgeleitet
  • Sollte das nicht funktionieren, wird versucht, die Ausgabe in die Datei $HOME/nohup.out umzuleiten (meistens der Fall)
  • Lässt sich die Datei nohup.out überhaupt nicht anlegen, verweigert nohup seine Ausführung

Als Rückgabewert liefert Ihnen die Funktion nohup den Fehlercode des Kommandos zurück

  • Sollte der Fehlercode allerdings den Wert 126 oder 127 haben, so bedeutet dies, dass nohup das Kommando gefunden hat, aber nicht starten konnte (126), oder dass nohup das Kommando gar nicht finden konnte (127)
Beispiele
 find / -user $USER -print > out.txt 2>&1 &
 [2] 4406
 kill -SIGHUP 4406
 you@host >
 [2]+  Aufgelegt          find / -user $USER -print >out.txt 2>&1
 nohup find / -user $USER -print > out.txt 2>&1 &
 [1] 4573
 kill -SIGHUP 4573
 ps | grep find
  4573 pts/40   00:00:01 find
 nohup find / -user $USER -print &
 [1] 10540
 nohup: hänge Ausgabe an nohup.out an
 exit
 ### --- Nach neuem Login ---- ####
 cat nohup.out
 
 /home/tot/HelpExplorer/uninstall.sh
 /home/tot/HelpExplorer/EULA.txt
 /home/tot/HelpExplorer/README
 /home/tot/HelpExplorer/starthelp
 /home/tot/.fonts.cache-1