• Allgemein
  • nohup: Hintergrundprozesse im Terminal ohne Unterbrechungen ausführen

nohup: Hintergrundprozesse im Terminal ohne Unterbrechungen ausführen

Was ist nohup?

Nohup (keine Hangups) ist ein nützliches Hilfsprogramm in Unix-basierten Systemen, das es dir ermöglicht, Hintergrundprozesse ohne Unterbrechungen durch Hangups oder die Beendigung der Shell auszuführen. Wenn du mit einem Befehl einen Hintergrundprozess startest, wird der Prozess durch ein Signal seines übergeordneten Prozesses (der Shell) unterbrochen, wenn sich der übergeordnete Prozess von der Shell abmeldet. Dies kann dazu führen, dass der Prozess gestoppt wird oder unbeendet bleibt.

Nohup löst dieses Problem, indem es ein neues Prozessgruppen-Leader (PGID) erstellt und den Hintergrundprozess in diese neue Prozessgruppe verschiebt. Der neue Prozess ist nicht direkt mit der Shell verbunden und wird daher nicht unterbrochen, wenn sich die Shell abmeldet. Stattdessen wird der Prozess weiterhin im Hintergrund ausgeführt, auch wenn du dich abmeldest oder dein Terminal schließt.

Haupteigenschaften:

  • Hält Hintergrundprozesse am Laufen, auch wenn die Shell beendet wird
  • Erstellt eine neue Prozessgruppe, um Unterbrechungen durch Hangups zu vermeiden
  • Leitet die Standardausgabe und -fehlerströme an eine Datei um, die du angeben kannst

Warum sollte ich nohup verwenden?

Wenn du ein Terminalbefehl ausführst und das Terminalfenster schließt, wird der Befehl unterbrochen. Dies kann zu Datenverlust oder unerwünschten Ergebnissen führen, wenn der Befehl eine längere Zeit läuft oder unbeaufsichtigt bleiben soll. Hier findest du einige Gründe, warum du nohup verwenden solltest:

Lange laufende Prozesse

Möchtest du einen Befehl über einen längeren Zeitraum im Hintergrund ausführen, z. B. eine Datenanalyse oder einen Webserver. Nohup stellt sicher, dass der Prozess auch dann weiterläuft, wenn du die Verbindung zum Terminal trennst oder das Fenster schließt.

Unbeaufsichtigte Prozesse

Wenn du Prozesse ausführen möchtest, die nicht deiner unmittelbaren Aufmerksamkeit bedürfen, wie z. B. Sicherungsoperationen oder Systemüberwachungen, kannst du nohup verwenden, um sicherzustellen, dass sie auch ohne deine Anwesenheit weiterlaufen.

Automatisierung von Aufgaben

Nohup kann verwendet werden, um Aufgaben zu automatisieren, die du regelmäßig im Hintergrund ausführen möchtest. Beispielsweise kannst du nohup verwenden, um einen Befehl zu einer bestimmten Zeit oder in regelmäßigen Abständen auszuführen.

Fehlerbehandlung

Nohup leitet die Standardausgabe und den Standardfehler in eine Logdatei um, selbst wenn der Prozess im Hintergrund läuft. Dies erleichtert die Fehlerbehebung, da du die Ausgabe auch nach dem Schließen des Terminalfensters überprüfen kannst.

Indem du nohup verwendest, kannst du die Kontinuität wichtiger Prozesse sicherstellen, auch wenn du nicht am Terminal anwesend bist. Dies kann Ausfallzeiten reduzieren, die Effizienz verbessern und dir die Kontrolle über deine Hintergrundprozesse geben.

Wie verwende ich nohup?

Um nohup zu verwenden, kannst du den folgenden Befehl in deinem Terminal eingeben:

nohup <Befehl> [Argumente]

Dabei ist <Befehl> das Programm oder der Befehl, den du im Hintergrund ausführen möchtest, und <Argumente> sind die Argumente, die du an den Befehl übergeben möchtest.

I/O-Umleitung

Wenn du Befehle im Hintergrund ausführst, möchten möglicherweise Ausgaben an die Konsole senden. Du kannst die Ausgaben umleiten, indem du die folgenden Optionen verwendest:

  • Standardausgabe (stdout): Um stdout umzuleiten, verwende >.
  • Standardfehlerausgabe (stderr): Um stderr umzuleiten, verwende 2>.
  • Beide Ausgaben: Um sowohl stdout als auch stderr umzuleiten, verwende &>.

Beispiel:

nohup python script.py &> log.txt

Dieser Befehl führt das Python-Skript script.py im Hintergrund aus und leitet sowohl stdout als auch stderr in die Datei log.txt um.

Sitzung anhängen

Wenn deine Hintergrundsitzung beendet wird, kannst du sie mit dem Befehl fg erneut an deine aktuelle Shell anhängen.

Beispiel:

fg

Best Practices

  • Log-Dateien verwenden: Leite nohup-Ausgaben in Log-Dateien um, um den Verlauf zu speichern und Fehlerbehebungen zu erleichtern.
  • Vorsicht bei langen laufenden Prozessen: Sehr lange laufende Prozesse können das System belasten. Verwende sie mit Vorsicht.
  • Prozessstatus überprüfen: Überwache den Status deiner Hintergrundprozesse regelmäßig mit Tools wie ps, jobs oder top.

Grundlagen der nohup-Syntax

Die Syntax von nohup ist relativ einfach und besteht aus dem Befehl selbst, gefolgt von den Optionen und dem Befehl, den du im Hintergrund ausführen möchtest.

Syntax

nohup Befehl [Optionen]

Optionen

Die am häufigsten verwendeten nohup-Optionen sind:

  • -m: Sendet eine Kopie der Standardausgabe und des Standardfehlerausgaben an mail.
  • -o [Datei]: Gibt an, dass die Standardausgabe in die angegebene Datei umgeleitet werden soll.
  • -e [Datei]: Gibt an, dass die Standardfehlerausgabe in die angegebene Datei umgeleitet werden soll.
  • -n: Verhindert, dass die Eingabe von der Standardeingabe gelesen wird.
  • -p: Fügt den Prozess der Prozessgruppe 0 hinzu, was das Beenden des Prozesses durch Signale verhindert, die an die Prozessgruppe gesendet werden.
  • -x: Veranlasst nohup, den angegebenen Befehl in einer neuen Shell auszuführen.

Beispiele

Hier sind einige Beispiele für die Verwendung der nohup-Syntax:

  • Führe einen Befehl ohne Unterbrechungen aus und sende seine Ausgabe per E-Mail:
nohup Befehl -m
  • Führe einen Befehl ohne Unterbrechungen aus und leite seine Ausgabe in eine Datei um:
nohup Befehl -o ausgabe.txt
  • Führe einen Befehl ohne Unterbrechungen aus und leite seine Fehlerausgabe in eine Datei um:
nohup Befehl -e fehler.txt

Beispiele für die Verwendung von nohup

Automatisches Ausführen von Skripten im Hintergrund

Verwenden von nohup zusammen mit & ermöglicht dir das automatische Ausführen von Skripten im Hintergrund:

nohup ./script.sh &

Dies führt script.sh im Hintergrund aus und leitet die Ausgabe in eine Datei namens nohup.out um.

Abfangen von Fehlerausgaben

Du kannst auch die Fehlerausgabe abfangen, indem du Folgendes verwendest:

nohup ./script.sh >logfile 2>&1 &

Dadurch wird die Standardausgabe (stdout) in die Datei logfile umgeleitet und die Standardfehlerausgabe (stderr) an stdout angehängt.

Fortsetzen von Prozessen nach Trennen der Verbindung

Wenn du dich vom Terminal getrennt hast, während ein Prozess mit nohup ausgeführt wurde, kannst du die Ausführung fortsetzen, indem du Folgendes ausführst:

tail -f nohup.out

Dies zeigt dir die fortlaufende Ausgabe des Prozesses an.

Ausführen von Befehlen mit Umgebungsvariablen

Du kannst auch Umgebungsvariablen festlegen, bevor du einen Befehl mit nohup ausführst:

nohup MY_VAR=value ./script.sh &

Dadurch wird die Umgebungsvariable MY_VAR mit dem Wert value für das Skript script.sh festgelegt.

Fehlerbehebung bei nohup

Fehlermeldung: "nohup: Befehl nicht gefunden"

  • Ursache: nohup ist nicht in der PATH-Variable enthalten.
  • Lösung: Führe nohup aus dem Verzeichnis /usr/bin aus oder füge /usr/bin zu deiner PATH-Umgebungsvariablen hinzu.

Fehlermeldung: "nohup: kann Befehl nicht finden"

  • Ursache: Der angegebene Befehl existiert nicht oder befindet sich nicht in der PATH-Variable.
  • Lösung: Überprüfe den Befehlsnamen und füge gegebenenfalls das Verzeichnis des Befehls zu deiner PATH-Umgebungsvariablen hinzu.

Fehlermeldung: "nohup: kein solches Gerät oder eine solche Datei"

  • Ursache: Die angegebene Ausgabeumleitungsdatei existiert nicht oder du hast keine Schreibberechtigungen für sie.
  • Lösung: Erstelle die Datei oder weise dir Schreibberechtigungen für sie zu.

Fehlermeldung: "nohup: kann Standardausgabe nicht umleiten"

  • Ursache: Du hast nicht die erforderlichen Berechtigungen zum Schreiben in die angegebene Ausgabeumleitungsdatei.
  • Lösung: Weise dir Schreibberechtigungen für die Datei zu.

Fehlermeldung: "nohup: kann Prozesskennung nicht ermitteln"

  • Ursache: Der nohup-Prozess wurde unerwartet beendet.
  • Lösung: Überprüfe die Protokolle oder die Ausgabeumleitungsdatei, um Hinweise auf den Grund für die Beendigung zu finden.

Allgemeine Tipps zur Fehlerbehebung

  • Überprüfe die Syntax deines nohup-Befehls.
  • Stelle sicher, dass du die richtigen Berechtigungen hast.
  • Überprüfe die Protokolle und die Ausgabeumleitungsdatei auf Fehlermeldungen.
  • Versuche, den nohup-Befehl mit der Option -x auszuführen, um zusätzliche Debuginformationen anzuzeigen.

Unterschiede zwischen nohup und &

Während sowohl nohup als auch & Prozesse im Hintergrund ausführen, gibt es einige entscheidende Unterschiede zwischen ihnen:

Dauerhaftigkeit

  • nohup: Prozesse, die mit nohup gestartet werden, bleiben auch nach dem Abmelden oder Schließen des Terminals aktiv. Sie werden zu sogenannten "Daemonen"-Prozessen.
  • &: Prozesse, die mit & gestartet werden, werden beendet, sobald sich der Benutzer vom Terminal abmeldet oder dieses schließt.

Signalbehandlung

  • nohup: nohup ignoriert das SIGHUP-Signal, das standardmäßig gesendet wird, wenn sich der Benutzer abmeldet. Dies ermöglicht es dem Prozess, fortzufahren, auch wenn das Terminal geschlossen wird.
  • &: Prozesse, die mit & gestartet werden, empfangen das SIGHUP-Signal und beenden sich daher, wenn sich der Benutzer abmeldet.

Ausgabenprotokollierung

  • nohup: nohup leitet die Standardausgabe und Standardfehlerausgabe des Befehls in eine Datei um (standardmäßig nohup.out). Dies ist nützlich, um Ausgaben zu protokollieren, auch wenn der Prozess im Hintergrund läuft.
  • &: Prozesse, die mit & gestartet werden, leiten ihre Ausgaben nicht automatisch in eine Datei um.

Praxisbeispiel

Angenommen, du möchtest einen lang laufenden Befehl ausführen, dessen Ausgabe du später einsehen möchtest. In diesem Fall wäre nohup die bessere Wahl, da der Prozess auch nach dem Schließen des Terminals aktiv bleibt und seine Ausgaben in eine Datei protokolliert werden.

Wenn du hingegen einen Prozess startest, der nur für eine kurze Zeit benötigt wird und keine Protokolldatei benötigt, kannst du & verwenden.

Zusätzliche Optionen für nohup

Neben den Grundfunktionen bietet nohup auch eine Reihe zusätzlicher Optionen, mit denen du die Ausführung deiner Hintergrundprozesse noch weiter anpassen kannst:

-o <Datei>

Mit dieser Option kannst du eine Datei angeben, in die die Standardausgabe deines Prozesses umgeleitet werden soll. Dies ist besonders nützlich, wenn du die Ausgabe des Prozesses für spätere Überprüfungen oder Analysen speichern möchtest.

-e <Datei>

Ähnlich wie -o kannst du mit dieser Option eine Datei angeben, in die die Standardfehlerausgabe deines Prozesses umgeleitet werden soll. So kannst du Fehlermeldungen und andere Problemausgaben für die spätere Fehlersuche protokollieren.

–append

Diese Option weist nohup an, die Ausgabe des Prozesses an das Ende der angegebenen Datei anzuhängen, anstatt sie zu überschreiben. Dies ist nützlich, wenn du die Ausgabe mehrerer Prozesse in einer einzigen Datei protokollieren möchtest.

–foreground

Im Gegensatz zum Standardverhalten von nohup bewirkt diese Option, dass der Prozess im Vordergrund ausgeführt wird, anstatt als Hintergrundjob. Dies kann nützlich sein, wenn du die Ausgabe des Prozesses in Echtzeit sehen möchtest oder wenn du ihn interaktiv steuern musst.

–dry-run

Diese Option führt einen "Trockenlauf" von nohup durch, ohne den angegebenen Befehl tatsächlich auszuführen. Dies kann hilfreich sein, um die Befehlssyntax zu überprüfen und sicherzustellen, dass alle Optionen korrekt festgelegt sind, bevor du den Prozess startest.

Beispiele für die Verwendung zusätzlicher Optionen

  • Um die Ausgabe eines Prozesses in die Datei "my_output.txt" umzuleiten:
nohup my_command > my_output.txt
  • Um Fehlermeldungen in die Datei "my_errors.txt" umzuleiten:
nohup my_command 2> my_errors.txt
  • Um die Ausgabe eines Prozesses an das Ende der Datei "my_log.txt" anzuhängen:
nohup my_command >> my_log.txt

Durch die Verwendung dieser zusätzlichen Optionen kannst du nohup optimal an deine spezifischen Anforderungen anpassen und sicherstellen, dass deine Hintergrundprozesse ordnungsgemäß ausgeführt und protokolliert werden.

Best Practices für die Verwendung von nohup

Befolge diese Best Practices, um die Verwendung von nohup effektiv zu gestalten:

Überprüfe die Berechtigungen

Stelle sicher, dass du die entsprechenden Berechtigungen zum Ausführen des Befehls im Hintergrund hast. Andernfalls kann nohup den Befehl nicht ausführen.

Verwende die Standardausgabeumleitung

Leite die Standardausgabe des Befehls in eine Datei um, um eine Aufzeichnung seiner Aktivitäten zu haben. Dies ist besonders hilfreich, wenn du den Prozess später überprüfen möchtest. Verwende beispielsweise nohup ./script.sh > output.txt &.

Überwache den Prozess

Überwache den Hintergrundprozess regelmäßig, um seinen Status zu überprüfen. Verwende dazu Befehle wie ps oder jobs. Wenn der Prozess unerwartet beendet wird, kannst du die Ursache untersuchen und entsprechende Maßnahmen ergreifen.

Setze Zeitstempel

Füge den Ausgabeprotokollen Zeitstempel hinzu, um den Beginn und das Ende des Hintergrundprozesses zu markieren. Dies hilft dir, die Dauer des Prozesses zu bestimmen und mögliche Unterbrechungen zu identifizieren.

Verwende Timeout-Optionen

Passe die Timeout-Optionen von nohup an, um den Prozess automatisch zu beenden, wenn er eine bestimmte Ausführungszeit überschreitet. Dies kann unerwünschte Prozesse verhindern, die unbeabsichtigt im Hintergrund laufen.

Umgib shell-Befehle mit Anführungszeichen

Wenn du shell-Befehle in nohup verwendest, umgib sie mit Anführungszeichen. Dies stellt sicher, dass die Befehle korrekt interpretiert werden.

Überlege dir die Verwendung von screen oder tmux

Für komplexere Hintergrundprozesse, die eine längere Ausführung erfordern, ziehe die Verwendung von Tools wie screen oder tmux in Betracht. Diese Tools bieten erweiterte Funktionen wie Sitzungsverwaltung und das Wiederherstellen von getrennten Sitzungen.

Fazit

Du hast nun ein umfassendes Verständnis der Verwendung von nohup erlangt, um Hintergrundprozesse im Terminal auszuführen, ohne durch Unterbrechungen gestört zu werden. Dieses Wissen ermöglicht es dir, Langzeitaufgaben und Skripte effizient auszuführen, ohne dass du sie ständig überwachen musst.

Vorteile der Verwendung von nohup

  • Kontinuierliche Ausführung bei Verbindungsabbrüchen: nohup stellt sicher, dass Prozesse weiterlaufen, selbst wenn du die Terminalverbindung schließt oder das System neu startest.
  • Prozesssteuerung: Du kannst die Ausführung von nohup-Prozessen mit Befehlen wie kill, ps und jobs steuern.
  • Fehlerbehandlung: nohup leitet Standardausgaben und -fehler in eine Logdatei um, sodass du etwaige Fehler später analysieren kannst.

Best Practices

  • Verwende nohup für langwierige Aufgaben oder Skripte, die über einen längeren Zeitraum ausgeführt werden müssen.
  • Lege eine Logdatei fest, um Fehler und Ausgaben zu protokollieren.
  • Vermeide die Verwendung von exit-Befehlen in nohup-Prozessen, da dies zur Beendigung des Prozesses führt.
  • Überwache die Ausführung von nohup-Prozessen regelmäßig, um sicherzustellen, dass sie wie gewünscht funktionieren.

Alternativen zu nohup

  • &: Der Operator & führt Prozesse ebenfalls im Hintergrund aus, bietet aber nicht den gleichen Grad an Fehlerbehandlung und Kontrolle wie nohup.
  • screen: Ein Terminal-Multiplexer, der es ermöglicht, mehrere Sitzungen in einem einzigen Terminalfenster gleichzeitig auszuführen.
  • tmux: Eine weitere Option für Terminal-Multiplexing, die eine fortschrittlichere Steuerung und Fensterverwaltung bietet.

Zusammenfassend lässt sich sagen, dass nohup ein unverzichtbares Werkzeug ist, um Hintergrundprozesse im Terminal ohne Unterbrechungen auszuführen. Indem du diese Best Practices einhältst, kannst du die Vorteile von nohup optimal nutzen und deine Aufgaben effizienter erledigen.