Frage Ich führe einen Linux-Prozess aus, nachdem ich mich ausgeloggt habe


Ich verbinde mich über SSH mit einem Linux-Rechner und versuche ein schweres Bash-Skript auszuführen, das Dateisystemoperationen durchführt. Es wird erwartet, dass es stundenlang läuft, aber ich kann die SSH-Sitzung wegen Problemen mit der Internetverbindung nicht offen lassen.

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


139
2017-09-15 06:00


Ursprung




Antworten:


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


EIN Terminal-Multiplexer stellt "virtuelle" Terminals zur Verfügung, die unabhängig vom "echten" Terminal laufen (eigentlich sind alle Terminals heute "virtuell", aber das ist ein anderes Thema für einen anderen Tag). Das virtuelle Terminal läuft weiter, selbst wenn Ihr echtes Terminal mit Ihrer SSH-Sitzung geschlossen ist.

Alle Prozesse, die vom virtuellen Terminal aus gestartet werden, laufen weiterhin mit diesem virtuellen Terminal. Wenn Sie sich wieder mit dem Server verbinden, können Sie sich wieder mit dem virtuellen Terminal verbinden und alles wird so aussehen, als ob nichts passiert wäre, außer der verstrichenen Zeit.

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 HUP signal (oder SIGHUP) wird vom Terminal an alle untergeordneten Prozesse gesendet, wenn das Terminal geschlossen wird. Die übliche Maßnahme 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 Ihre Prozesse nicht SIGHUP erhalten.

Zwei einfache Methoden sind dies nohup und disown.

Für weitere Informationen über wie nohup und disown Werke lesen diese Frage und antworten: https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

Hinweis: Obwohl die Prozesse weiter ausgeführt werden, können Sie nicht mehr mit ihnen interagieren, da sie nicht mehr an ein Terminal angeschlossen sind. Diese Methode ist vor allem für lange laufende Batch-Prozesse nützlich, die nach dem Start keine Benutzereingaben mehr benötigen.


132
2017-09-15 06:05



Ich mag diese Antwort, da sie sowohl für interaktive als auch für nicht interaktive Situationen eine Lösung bietet. Im interaktiven Fall screen gibt Ihnen viel mehr Möglichkeiten, aber wenn Sie verwenden authorized_keys um es Benutzern zu ermöglichen, ein Skript per Fernzugriff auszuführen ssh, das nohup Die Option ist eine nette einfache Möglichkeit für das Skript Prozesse zu starten, die länger dauern als die ssh Sitzung verwendet, um sie zu starten. - Mark Booth
@rahmanisback - Denken Sie daran, dass Sie Ihre akzeptierte Antwort jederzeit ändern können. Nur weil bis jetzt die Antwort von EricA am besten gewählt ist, bedeutet das nicht, dass es die beste Antwort für Sie ist, und dass Ihre angenommene Antwort vielleicht mehr Leute ermutigen wird, sie als gute Antwort zu wählen. - Mark Booth
* hust * tmuxisbetter * hust * - crasic
tmux > Bildschirm. Probieren Sie es aus, Sie werden nie wiederkommen. - h0tw1r3
@TheLQ - byobu ist GNU-Bildschirm. Du verwendest immer noch den Bildschirm, nur mit einer stark angepassten .screenrc. - EEAA


Es gibt ein paar Möglichkeiten, dies zu tun, aber diejenige, die ich am nützlichsten finde, ist zu verwenden GNU-Bildschirm.

Nachdem Sie sich angemeldet haben, führen Sie screen. Dadurch wird eine andere Shell gestartet, die auf dem Bildschirm ausgeführt wird. Führen Sie Ihren Befehl aus, und führen Sie dann a aus Strg-ein  d.

Dies wird Sie von der Bildschirmsitzung "trennen". An dieser Stelle können Sie sich abmelden oder alles andere tun, was Sie möchten.

Wenn Sie sich erneut mit der Bildschirmsitzung verbinden möchten, führen Sie einfach aus screen -RD von der Shell-Eingabeaufforderung (als derselbe Benutzer, der die Sitzung erstellt hat).


92
2017-09-15 06:07



Genial! Ordentliche Antwort, danke ... - rahmanisback
Der Bildschirm hat eine ganze Reihe von Befehlen, beginnend mit Strg-a. Wenn Sie nur ein Extra lernen, beginnen Sie mit "Strg-a?". Dann lernst du "Strg-a c" und "Strg-an" - olafure
@olafure +1, danke. Es sieht so aus, als ob Screen zu meiner primären Toolbox gehört. - rahmanisback
tmux > Bildschirm. Probieren Sie es aus, Sie werden nie wiederkommen. - h0tw1r3
+1 für TMux. Ich habe den Bildschirm vor 5 Wochen aufgegeben. - Bryan Hunt


Im bash, das disown Stichwort ist dafür perfekt geeignet. Führen Sie zunächst Ihren Prozess im Hintergrund aus (entweder verwenden &, oder ^Z dann tippe ein bg):

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

Durch Eingabe von jobs Sie können sehen, dass der Prozess immer noch von der Shell gehört:

$ jobs
[1]+  Running  wget

Wenn Sie sich an diesem Punkt abmelden würden, würde die Hintergrundaufgabe ebenfalls beendet. Wenn Sie jedoch laufen disownbash löst den Job und lässt ihn weiterlaufen:

$ disown

Sie können dies bestätigen:

$ jobs
$ logout

Sie können sogar kombinieren & und disown auf der gleichen Linie, wie:

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

Das ist besser als Laufen nohup Meiner Meinung nach, weil es nicht geht nohup.out Dateien überall auf Ihrem Dateisystem verstreut. Ebenfalls, nohup muss ausgeführt werden, bevor Sie den Befehl ausführen - disown kann verwendet werden, wenn Sie erst später entscheiden, dass Sie den Hintergrund abstecken und die Aufgabe lösen möchten.


70
2017-09-15 12:27



Das ist eine sehr gute Antwort, 1+. Die einzige Vorliebe für nohup oder Screen wäre die Unabhängigkeit von bash und könnte mit anderen Shells verwendet werden. Aber ich werde bei jedem Ansatz bleiben, wenn ich bash benutze. - rahmanisback
Ja - das ist Bash-spezifisch, da Bash die einzige Shell ist, die ich je benutzt habe. Ich frage mich, ob andere Shells etwas ähnliches unterstützen (d. H. Im Hintergrund ohne Nohup starten) - es wäre fantastisch, wenn jemand andere Antworten für andere Shells posten könnte. - Jeremy Visser
Sehen Sie meine Antwort, die zeigt, wie Sie es mit jedem Sh-Lookalike machen können - w00t
+1, um später entscheiden zu können. Genau in diesem Moment hatte ich ein Bedürfnis dafür. arbeitete wie angekündigt - code_monk


Das Tool nohup, das auf den meisten Linux-Boxen verfügbar ist, wird dies tun.


37
2017-09-15 06:14



Dies ist bei weitem die einfachste Antwort. Jede Ausgabe von wird automatisch an nohup.out gerichtet und kann später untersucht werden. - Julian
Nohup benötigt überhaupt kein Zsh. - Aaron Brown
Nohup ist die richtige Antwort, es ist kurz für kein Auflegen. - Kinjal Dixit
Nohup ist auf weit mehr Maschinen als auf dem Bildschirm gefunden, also sollten Sie wissen, wie man es benutzt. - Zenon


Nur um gründlich zu sein, werde ich darauf hinweisen tmux, die die gleiche Grundidee wie Bildschirm hat:

tmux soll eine moderne, BSD-lizenzierte Alternative zu Programmen wie GNU-Screen sein. Hauptmerkmale umfassen:

  • Eine leistungsstarke, konsistente, gut dokumentierte und leicht skriptfähige Befehlsschnittstelle.
  • Ein Fenster kann horizontal und vertikal in Fenster aufgeteilt werden.
  • Fenster können frei verschoben und in der Größe verändert oder in voreingestellte 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 nach Text im Ziel suchen.
  • Terminal-Sperre, manuell oder nach einer Zeitüberschreitung.
  • Eine saubere, leicht erweiterbare, BSD-lizenzierte Codebase, die aktiv entwickelt wurde.

Es ist jedoch in etwa unendlich viel einfacher, auf Google zu suchen.


27
2017-09-15 06:23



Verwenden "gnu screen" wie Ihre Suchanfrage gut funktioniert. - gnur
+1000 für tmux! - mbq


Der Bildschirm ist zu viel Aufwand, um die Prozesse beim Abmelden nur noch laufen zu lassen.

Versuchen dtach:

dtach ist ein in C geschriebenes Programm, das die Trennfunktion von   Bildschirm, der es ermöglicht, ein Programm in einer Umgebung auszuführen, die   ist vor dem steuernden Terminal geschützt. Zum Beispiel das Programm   unter der Kontrolle von dtach würde nicht von dem Terminal betroffen sein   aus irgendeinem Grund getrennt.

dtach wurde geschrieben, weil der Bildschirm meine Bedürfnisse nicht angemessen erfüllte; ich   die zusätzlichen Funktionen des Bildschirms, wie die Unterstützung für mehrere, nicht benötigt   Terminals oder Terminal-Emulation-Unterstützung. Bildschirm war auch zu groß,   sperrig und hatte Quellcode, der schwer zu verstehen war.

Bildschirm störte auch meine Verwendung von Vollbild-Anwendungen wie   Emacs und IrcII, wegen seiner exzessiven Interpretation des Stroms   zwischen dem Programm und den angeschlossenen Terminals. dtach hat kein a   Terminal - Emulationsschicht und übergibt den rohen Ausgabestrom des   Programm zu den angeschlossenen Terminals. Die einzige Eingabeverarbeitung, die   dtach führt eine Suche nach dem Trennzeichen durch (welches signalisiert   dtach, um sich vom Programm zu trennen) und den Suspend-Schlüssel zu bearbeiten   (was dtach anweist, sich vorübergehend auszusetzen, ohne die   laufendes Programm), und beide können auf Wunsch deaktiviert werden.

Im Gegensatz zu Bildschirm hat dtach minimale Funktionen und ist extrem klein.   Dadurch kann dtach leichter auf Fehler und Sicherheit überprüft werden   Löcher und macht es zugänglich in Umgebungen, in denen der Platz begrenzt ist,   wie auf Rettungsdisketten.


11
2017-09-15 15:06



Vielen Dank. Ich kam hierher, um auch nur über dtach zu schreiben. Es ist jetzt meine Sache für die Endablösung. Bildschirm tut viel zu viel und stört die Eingabe in einem lächerlichen Grad. Der Fact-Screen braucht eine eigene Termcap ist ziemlich beunruhigend. - fluffy


Hier ist eine Möglichkeit, jeden Shell-Prozess zu dämonisieren, keine externen Programme benötigt:

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

Wenn Sie dann Ihre Sitzung schließen, wird der Job weiter ausgeführt, wie durch die Datei output.txt (die Pufferung hat, so dass es eine Weile dauert, bis sie nicht Null ist) belegt ist. Vergessen Sie nicht, Ihren Job nach dem Testen zu töten.

Alles, was Sie tun müssen, ist, stdin zu schließen und den Job zu hinterfragen. Um wirklich gut zu sein, zuerst cd / Du hältst dich also nicht an einem Reittier fest.

Dies funktioniert sogar in einfachen sh unter Solaris.


9
2017-09-16 16:48



Interessant. Das ergab einige bemerkenswerte Fragen. Ich kann sehen, dass du die STDIN auf nichts einstellst - Operator? Was ist der Unterschied zwischen < /dev/null und &- ? Ich schätze, dass STDIN (und andere STDOUT und STDERR) entweder eine Datei zugewiesen werden könnte < fileoder ein Stream von <& stream im Falle von STDIN. Sch 100 sch 100 100 100 100 100 100 100 sch sch 100 100 100 sch 100 100 100 100 sch 100 sch 100 sch 100 sch 100 sch 100 sch 100 sch 100 sch dieser < /dev/null in deinem Beispiel oben? Und tut der Betreiber - oben beziehen sich auf eine Null als Stream? - rahmanisback
Wenn Sie x <& - machen, schließt das den Dateideskriptor x. In diesem Fall gibt es kein x, was den Bash-Standardwert auf 1 setzt, d. H. Die Standardeingabe. Wenn Sie </ dev / null verwenden, schließen Sie nicht die Standardeingabe, sondern geben dem Programm nur eine leere Datei als Eingabe. - w00t
Und um ehrlich zu sein, weiß ich nicht wirklich, warum das Ding dämonisiert :-) Es funktioniert aber, wir benutzen es in der Produktion. Ich entdeckte es, während ich rumhüpfte und hoffte, dass ich einen Prozess in der Shell dämonisieren konnte, ohne etwas Besonderes zu brauchen - also begann ich mit dem Schließen der Standardeingabe und das war genug. Ich sollte einige Shell-Quellen lesen, aber ich gehe davon aus, dass wenn Sie den Standard-Prozess schließen und den Prozess abschließen, er auch den Prozess ablöst. - w00t
Ich denke, der Grund ist, dass ein SIGHUP (das eigentliche Signal, das das Kind zum Abbruch bringt, wenn die Shell stirbt) ausgelöst wird, wenn ein Elternprozess den Stdin-Handle seines Kindes schließt. Jedoch, wenn stdin beginnt als null, anstatt nach der Tat geschlossen zu sein, gibt es keine Möglichkeit für den Elternteil, die SIGHUP auszulösen. Schöner Fund - hätte nie daran gedacht. - Jeremy Visser
@ JeremyVisser das klingt wirklich plausibel! - w00t