GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was genau bestimmt, ob ein Hintergrundjob beendet wird, wenn die Shell beendet wird, oder ob er beendet wird?

Ein Prozess wird nicht "mit SIGHUP beendet" - zumindest nicht im strengen Sinne des Wortes. Wenn die Verbindung unterbrochen wird, wird dem Steuerungsprozess des Terminals (in diesem Fall Bash) vielmehr ein Auflegesignal* gesendet, das allgemein als „HUP-Signal“ oder einfach nur SIGHUP abgekürzt wird.

Wenn ein Prozess jetzt ein Signal empfängt, kann er damit umgehen, wie er will**. Die Standardeinstellung für die meisten Signale (einschließlich HUP) ist das sofortige Beenden. Dem Programm steht es jedoch frei, das Signal stattdessen zu ignorieren oder sogar eine Art Signal-Handler-Funktion auszuführen.

Bash wählt die letzte Option. Sein HUP-Signal-Handler prüft, ob die Option "huponexit" wahr ist, und wenn ja, sendet er SIGHUP an jeden seiner untergeordneten Prozesse. Erst wenn es damit fertig ist, wird Bash beendet.

Ebenso kann jeder untergeordnete Prozess tun, was er will, wenn er das Signal empfängt:ihn auf dem Standardwert belassen (d. h. sofort sterben), ihn ignorieren oder einen Signal-Handler ausführen.

Nohup ändert nur die Standardaktion für den untergeordneten Prozess auf „Ignorieren“. Sobald der untergeordnete Prozess jedoch läuft, kann er seine eigene Antwort auf das Signal frei ändern.

Ich denke, das ist der Grund, warum einige Programme sterben, obwohl Sie sie mit nohup ausgeführt haben:

  1. Nohup setzt die Standardaktion auf "Ignorieren".
  2. Das Programm muss beim Beenden eine Art Aufräumarbeiten durchführen, also installiert es einen SIGHUP-Handler, der nebenbei das "Ignorieren"-Flag überschreibt.
  3. Wenn das SIGHUP ankommt, läuft der Handler, bereinigt die Datendateien des Programms (oder was auch immer getan werden musste) und beendet das Programm.
  4. Der Benutzer kennt oder kümmert sich nicht um den Handler oder die Bereinigung und sieht nur, dass das Programm trotz nohup beendet wurde.

Hier kommt "disown" ins Spiel. Ein Prozess, der von Bash disowned wurde, erhält niemals das HUP-Signal, unabhängig von der Option huponexit. Selbst wenn also das Programm seinen eigenen Signalhandler einrichtet, wird das Signal nie tatsächlich gesendet, sodass der Handler nie ausgeführt wird. Beachten Sie jedoch, dass, wenn das Programm versucht, einem abgemeldeten Benutzer Text anzuzeigen, dies einen E/A-Fehler verursacht, der dazu führen kann, dass das Programm trotzdem beendet wird.

* Und, ja, bevor Sie fragen, die "Hang-up"-Terminologie ist noch aus den Tagen der Einwahl-Mainframes von UNIX übriggeblieben.

** Jedenfalls die meisten Signale. SIGKILL zum Beispiel immer bewirkt, dass das Programm sofort beendet wird, Punkt.


Die Punkte 1-4 sind richtig. Zu Punkt 5 weiß ich nichts. Was Ihren letzten Punkt betrifft, eine feine Anwendung, Bildschirm , ermöglicht es Ihnen, alle Prozesse bis zu ihrem natürlichen Ende laufen zu lassen, unabhängig davon, wie Sie Ihre Verbindung beenden. Bildschirm ist in den Repos.

Die Mann-Beschreibung von screen ist nicht leicht zu lesen, aber sie besagt unter anderem:

Wenn screen aufgerufen wird, erstellt es ein einzelnes Fenster mit einer darin enthaltenen Shell (oder dem angegebenen Befehl) und geht Ihnen dann aus dem Weg, sodass Sie das Programm wie gewohnt verwenden können. Dann können Sie jederzeit neue (Vollbild-)Fenster mit anderen Programmen darin (einschließlich weiterer Shells) erstellen, vorhandene Fenster beenden, eine Liste von Fenstern anzeigen, die Ausgabeprotokollierung ein- und ausschalten, Text dazwischen kopieren und einfügen Fenster öffnen, den Scrollback-Verlauf einsehen, beliebig zwischen Fenstern wechseln usw. Alle Fenster führen ihre Programme völlig unabhängig voneinander aus.Programme laufen weiter, wenn ihr Fenster gerade nicht sichtbar ist und sogar wenn der ganze Bildschirm angezeigt wird Sitzung wird vom Endgerät des Benutzers getrennt . Wenn ein Programm beendet wird, beendet screen (standardmäßig) das Fenster, das es enthielt. War dieses Fenster im Vordergrund, wechselt die Anzeige zum vorherigen Fenster; wenn keine übrig sind, wird der Bildschirm beendet.

Ich habe den wichtigsten Teil hervorgehoben:Sie können das Fenster mit dem Befehl Strg+a+d trennen, und dann können Sie Ihre Sitzung beenden/abmelden, und das jetzt getrennte Fenster wird weiterhin leben, wobei die darin enthaltenen Programme weiterhin ausgeführt werden. Wenn Sie sich wieder verbinden, beispielsweise indem Sie eine neue SSH-Sitzung starten, wird der Befehl screen -r setzt die zuvor getrennte Bildschirmsitzung fort, wobei alle Ausgaben für Standardfehler/Ausgabe deutlich sichtbar sind.


Linux
  1. Init-System mit der Shell erkennen?

  2. Was genau passiert, wenn ich eine Datei in der Shell ausführe?

  3. Was genau ist „ein Stop-Job“, wie in „ein Stop-Job läuft …“?

  4. Warum wird der Vordergrundjob bei der Eingabe von Strg-c in einem Terminal nicht beendet, bis er abgeschlossen ist?

  5. Was sind die verschiedenen Arten von Shells in Linux?

Was ist die Shell unter Linux?

Was ist der Unterschied zwischen Login- und Non-Login-Shell

Linux – Was genau meinen wir, wenn wir sagen, dass wir Linux verwenden?

tee:Was genau macht die Option --ignore-interrupts?

Welchen Umfang haben exportierte Unix-Shell-Variablen?

Was ist die Standard-Shell von Busybox?