Linux/Prozess/Hintergrund
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
# Name bg1
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
Hinweis Beim Testen auf verschiedenen Systemen ist mir allerdings aufgefallen, dass dieser Effekt nicht überall auftrat
|
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
|
Der Prozess wird vor dem SIGHUP-Signal geschützt
|
Wenn das Kommando die Standardausgabe und Standardfehlerausgabe auf das laufende Terminal benutzt, so wird diese in die Datei nohup.out umgeleitet
|
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