Lösung 1:
Am besten starten Sie den Vorgang in einem Terminal-Multiplexer. Alternativ können Sie dafür sorgen, dass der Prozess das HUP-Signal nicht empfängt.
Ein Terminal-Multiplexer stellt "virtuelle" Terminals bereit, die unabhängig vom "echten" Terminal laufen (eigentlich 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 sein, als ob nichts passiert wäre, außer der verstrichenen Zeit.
Zwei beliebte Terminal-Multiplexer sind screen 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 Aktion beim Empfang von SIGHUP ist die Beendigung. Wenn also 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 empfangen.
Zwei einfache Methoden dazu sind nohup
und disown
.
Weitere Informationen darüber, wie nohup
und disown
funktioniert, lesen Sie diese Frage und beantworten Sie sie: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 mit einem Terminal verbunden sind. Diese Methode ist vor allem für langlaufende Batch-Prozesse sinnvoll, die nach dem Start keine Benutzereingaben mehr benötigen.
Lösung 2:
Es gibt ein paar Möglichkeiten, dies zu tun, aber am nützlichsten finde ich die Verwendung von GNU Screen.
Nachdem Sie sich per SSH angemeldet haben, führen Sie screen
aus . Dadurch wird eine andere Shell gestartet, die innerhalb des Bildschirms ausgeführt wird. Führen Sie Ihren Befehl aus und führen Sie dann ein Strg aus -a d .
Dadurch werden Sie von der Bildschirmsitzung "getrennt". An dieser Stelle können Sie sich abmelden oder alles tun, was Sie möchten.
Wenn Sie sich wieder mit der Bildschirmsitzung verbinden möchten, führen Sie einfach screen -RD
aus von der Shell-Eingabeaufforderung (als derselbe Benutzer, der die Sitzung erstellt hat).
Lösung 3:
In bash
, die disown
Stichwort ist dafür perfekt geeignet. Führen Sie zuerst Ihren Prozess im Hintergrund aus (verwenden Sie entweder &
, oder ^Z
Geben Sie dann bg
ein ):
$ wget --quiet http://server/some_big_file.zip &
[1] 1156
Durch Eingabe von jobs
Sie können sehen, dass der Prozess immer noch der Shell gehört:
$ jobs
[1]+ Running wget
Wenn Sie sich an dieser Stelle abmelden, wird auch die Hintergrundaufgabe beendet. Wenn Sie jedoch disown
ausführen , bash trennt den Job und lässt ihn weiterlaufen:
$ disown
Sie können dies bestätigen:
$ jobs
$ logout
Sie können sogar die &
kombinieren und disown
in der gleichen Zeile, wie:
$ wget --quiet http://server/some_big_file.zip & disown
$ logout
Das ist besser als nohup
auszuführen meiner Meinung nach, weil es nohup.out
nicht verlässt Dateien, die überall in Ihrem Dateisystem verstreut sind. Außerdem nohup
muss ausgeführt werden, bevor Sie den Befehl ausführen – disown
kann verwendet werden, wenn Sie erst später entscheiden, dass Sie die Aufgabe in den Hintergrund stellen und trennen möchten.
Lösung 4:
Das Tool nohup, das auf den meisten Linux-Systemen verfügbar ist, erledigt dies.
Lösung 5:
Nur um gründlich zu sein, weise ich auf tmux hin, 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 Befehlsschnittstelle.
- Ein Fenster kann horizontal und vertikal in Bereiche geteilt werden.
- Bereiche können frei verschoben und in der Größe verändert oder in voreingestellten Layouts angeordnet werden.
- Unterstützung für UTF-8- und 256-Farbterminals.
- 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, leicht erweiterbare, BSD-lizenzierte Codebasis, die aktiv weiterentwickelt wird.
Es ist jedoch ungefähr unendlich einfacher, bei Google danach zu suchen.