it-swarm.com.de

Einen Linux-Prozess nach dem Abmelden am Laufen halten

Ich stelle über SSH eine Verbindung zu einem Linux-Computer her und versuche, ein umfangreiches Bash-Skript auszuführen, das Dateisystemoperationen ausführt. Es wird erwartet, dass es stundenlang läuft, aber ich kann die SSH-Sitzung aufgrund von Problemen mit der Internetverbindung nicht offen lassen.

Ich bezweifle, dass das Skript mit dem Hintergrundoperator, dem kaufmännischen Und (&), wird den Trick machen, weil ich es versucht habe und später festgestellt habe, dass der Prozess nicht abgeschlossen wurde. Wie kann ich mich abmelden und den Prozess am Laufen halten?

143
doc_id

Die beste Methode besteht darin, den Prozess in einem Terminal-Multiplexer zu starten. Alternativ können Sie dafür sorgen, dass der Prozess das HUP-Signal nicht empfängt.


Ein Terminal-Multiplexer bietet "virtuelle" Terminals, die unabhängig vom "realen" Terminal laufen (tatsächlich sind heute alle Terminals "virtuell", aber das ist ein anderes Thema für einen anderen Tag). Das virtuelle Terminal läuft auch dann weiter, wenn Ihr reales Terminal mit Ihrer SSH-Sitzung geschlossen wird.

Alle vom virtuellen Terminal gestarteten Prozesse werden mit diesem virtuellen Terminal weiter ausgeführt. Wenn Sie sich wieder mit dem Server verbinden, können Sie sich wieder mit dem virtuellen Terminal verbinden, und alles wird so aussehen, als wäre nichts passiert, außer der Zeit, die vergangen ist.

Zwei beliebte Terminal-Multiplexer sind Bildschirm und tmux .

Bildschirm hat eine steile Lernkurve. Hier ist ein gutes Tutorial mit Diagrammen, die das Konzept erklären: http://www.ibm.com/developerworks/aix/library/au-gnu_screen/


Das Signal HUP (oder SIGHUP) wird vom Terminal an alle untergeordneten Prozesse gesendet, wenn das Terminal geschlossen wird. Die übliche Aktion beim Empfang von SIGHUP ist das Beenden. Wenn Ihre SSH-Sitzung getrennt wird, werden alle Ihre Prozesse beendet. Um dies zu vermeiden, können Sie dafür sorgen, dass Ihre Prozesse kein SIGHUP erhalten.

Zwei einfache Methoden hierfür sind Nohup und disown .

Weitere Informationen zur Funktionsweise von Nohup und disown finden Sie in dieser Frage und Antwort: https://unix.stackexchange.com/questions/3886/difference-between-Nohup-disown -und

Hinweis: Obwohl die Prozesse weiterhin ausgeführt werden, können Sie nicht mehr mit ihnen interagieren, da sie nicht mehr an ein Terminal angeschlossen sind. Diese Methode ist hauptsächlich für lange laufende Stapelprozesse nützlich, für die nach dem Start keine Benutzereingaben mehr erforderlich sind.

135
lesmana

Es gibt einige Möglichkeiten, dies zu tun, aber die, die ich am nützlichsten finde, ist die Verwendung von GNU Screen .

Führen Sie nach dem Einfügen screen aus. Dadurch wird eine weitere Shell gestartet, die im Bildschirm ausgeführt wird. Führen Sie Ihren Befehl aus und führen Sie dann a aus Ctrl- -ad.

Dadurch werden Sie von der Bildschirmsitzung "getrennt". An diesem Punkt können Sie sich abmelden oder alles andere tun, was Sie möchten.

Wenn Sie erneut eine Verbindung zur Bildschirmsitzung herstellen möchten, führen Sie einfach screen -RD über die Shell-Eingabeaufforderung (als derselbe Benutzer, der die Sitzung erstellt hat).

92
EEAA

In bash ist das Schlüsselwort disown perfekt dafür geeignet. Führen Sie Ihren Prozess zunächst im Hintergrund aus (verwenden Sie entweder & Oder ^Z Und geben Sie dann bg ein):

$ wget --quiet http://server/some_big_file.Zip &
[1] 1156

Durch Eingabe von jobs können Sie sehen, dass der Prozess immer noch im Besitz der Shell ist:

$ jobs
[1]+  Running  wget

Wenn Sie sich zu diesem Zeitpunkt abmelden, wird auch die Hintergrundaufgabe beendet. Wenn Sie jedoch disown ausführen, löst bash den Job und lässt ihn weiterlaufen:

$ disown

Sie können dies bestätigen:

$ jobs
$ logout

Sie können sogar & Und disown in derselben Zeile kombinieren, wie:

$ wget --quiet http://server/some_big_file.Zip & disown
$ logout

Dies ist meiner Meinung nach besser als das Ausführen von Nohup, da keine Nohup.out - Dateien im gesamten Dateisystem verstreut sind. Außerdem muss Nohup ausgeführt werden, bevor Sie den Befehl ausführen. disown kann verwendet werden, wenn Sie erst später entscheiden, dass Sie die Aufgabe im Hintergrund ausführen und trennen möchten.

74
Jeremy Visser

Das auf den meisten Linux-Boxen verfügbare Tool Nohup erledigt dies.

37
Korjavin Ivan

Um gründlich zu sein, möchte ich auf tmux hinweisen, das die gleiche Grundidee wie screen hat:

tmux soll eine moderne, BSD-lizenzierte Alternative zu Programmen wie GNU screen) sein. Zu den Hauptfunktionen gehören:

  • Eine leistungsstarke, konsistente, gut dokumentierte und leicht skriptfähige Befehlsoberfläche.
  • Ein Fenster kann horizontal und vertikal in Fenster unterteilt werden.
  • Fenster können frei verschoben und in der Größe geändert oder in voreingestellten Layouts angeordnet werden.
  • Unterstützung für UTF-8- und 256-Farben-Terminals.
  • Kopieren und Einfügen mit mehreren Puffern.
  • Interaktive Menüs zur Auswahl von Fenstern, Sitzungen oder Clients.
  • Ändern Sie das aktuelle Fenster, indem Sie im Ziel nach Text suchen.
  • Terminalsperre manuell oder nach einer Zeitüberschreitung.
  • Eine saubere, einfach zu erweiternde, BSD-lizenzierte Codebasis, die sich in der aktiven Entwicklung befindet.

Es ist jedoch ungefähr unendlich einfacher, bei Google zu suchen.

27
Handyman5

Der Bildschirm ist zu viel des Guten, um Prozesse beim Abmelden am Laufen zu halten.

Versuchen Sie dtach :

dtach ist ein in C geschriebenes Programm, das die Funktion zum Trennen des Bildschirms emuliert, mit der ein Programm in einer Umgebung ausgeführt werden kann, die vor dem steuernden Terminal geschützt ist. Zum Beispiel würde das Programm unter der Kontrolle von dtach nicht davon betroffen sein, dass das Terminal aus irgendeinem Grund getrennt wird.

dtach wurde geschrieben, weil der Bildschirm meinen Anforderungen nicht angemessen entsprach; Ich brauchte keine zusätzlichen Funktionen des Bildschirms, wie die Unterstützung mehrerer Terminals oder die Unterstützung der Terminalemulation. Der Bildschirm war auch zu groß, sperrig und hatte einen schwer verständlichen Quellcode.

der Bildschirm störte auch meine Verwendung von Vollbildanwendungen wie emacs und ircII, da der Stream zwischen dem Programm und den angeschlossenen Terminals übermäßig interpretiert wurde. dtach hat keine Terminalemulationsschicht und leitet den Rohausgabestream des Programms an die angeschlossenen Terminals weiter. Die einzige Eingabeverarbeitung, die dtach ausführt, besteht darin, nach dem Trennzeichen zu suchen (das dtach signalisiert, sich vom Programm zu trennen) und den Suspend-Schlüssel zu verarbeiten (der dtach anweist, sich vorübergehend auszusetzen, ohne das laufende Programm zu beeinträchtigen). Beide können beides auf Wunsch deaktiviert werden.

Im Gegensatz zum Bildschirm hat dtach nur minimale Funktionen und ist extrem klein. Auf diese Weise kann dtach einfacher auf Fehler und Sicherheitslücken überprüft werden, und es ist in Umgebungen zugänglich, in denen der Speicherplatz begrenzt ist, z. B. auf Rettungsdisketten.

13
sml

Hier ist eine Möglichkeit, einen Shell-Prozess zu dämonisieren, ohne dass externe Programme erforderlich sind:

( while sleep 5; do date; done ) <&- >output.txt &

Wenn Sie dann Ihre Sitzung schließen, wird der Job weiterhin ausgeführt, wie aus der Datei output.txt hervorgeht (die über eine Pufferung verfügt, sodass es eine Weile dauert, bis Nicht-Null angezeigt wird). Vergessen Sie nicht, Ihren Job nach dem Testen zu beenden.

Alles, was Sie tun müssen, ist, den Job zu schließen und den Hintergrund zu bestimmen. Um wirklich gut zu sein, zuerst cd / damit du dich nicht an einem Reittier festhältst.

Dies funktioniert auch in einfachen sh unter Solaris.

9
w00t

Der Befehl at kann für diese Art von Situation nützlich sein. Geben Sie beispielsweise Folgendes ein:

at now

Anschließend können Sie einen Befehl oder eine Reihe von Befehlen eingeben, die ausgeführt werden. Die Ergebnisse sollten per E-Mail an Sie gesendet werden, wenn die E-Mail auf dem Computer korrekt eingerichtet ist.

Anstelle von now können Sie optional eine Uhrzeit mit einem Datum oder einen Zeitausdruck wie now + 15 minutes Angeben. Weitere Informationen finden Sie unter man at.

7
rjmunro

byobu unter Ubuntu ist ein schönes Front-End für den Bildschirm. Durch Drücken Ctrl- -? Sie erhalten eine Liste aller Tastaturkürzel. Es wird eine Statusleiste hinzugefügt, die nützlich sein kann, um die CPU-Auslastung, den Speicherplatz usw. zu überwachen. Insgesamt bietet es eine Erfahrung, die ich als terminalbasierte VNC-Verbindung beschreiben würde.

Nohup ermöglicht das Starten eines Jobs im Hintergrund, wobei die Ausgabe an eine Protokolldatei weitergeleitet wird, die bei Bedarf jederzeit nach/dev/null umgeleitet werden kann.

7
John Beckett