So stellen Sie eine Shell nach einer Unterbrechung wieder her

37

Ich arbeite gerade an einem entfernten CentOS 5.6-Computer, und mein Netzwerk fällt immer weiter aus. Gibt es eine Möglichkeit, meine unterbrochenen Sitzungen wiederherzustellen, nachdem ich die Verbindung wiederhergestellt habe?

BEARBEITEN: Ich aktualisiere und installiere mit yum und mache mir Sorgen, dass dies ein Problem sein könnte, wenn Prozesse in der Mitte von allem, was sie tun, hängen bleiben.

Jeff Schaller
quelle
6
tmux oder screen.
Siehe

Antworten:

63

Es gibt keinen Weg, aber um dies zu verhindern, benutze ich gerne tmux. Ich starte tmux, starte die Operation und mache mich auf den Weg. Wenn ich zurückkomme und feststelle, dass die Verbindung unterbrochen wurde, muss ich nur noch eine Verbindung herstellen und tippen tmux attach.

Hier ist ein Beispiel.

$ tmux
$ make <something big>
......
Connection fails for some reason
Reconect

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0
Back in the tmux sesion
Braiam
quelle
Ich habe kein tmux und darf keine Dinge installieren, die nicht auf meiner
5
@sergio Mein Herz blutet :-)) Verwenden screen.
4
@sergio Auf einem Unix-System kann praktisch jede Anwendung, für deren Ausführung keine Root-Berechtigungen erforderlich sind, in einem Basisverzeichnis installiert werden.
Kusalananda
35

Die Empfehlungen für tmux und screen sind gute Vorschläge. Sie implizieren die Antwort auf Ihre Frage, geben diese jedoch nicht an. Die Antwort auf die Frage lautet: Es gibt keinen Weg. Wenn Sie sich über ssh anmelden, wird die Shell beendet, wenn die Verbindung getrennt wird. Die Problemumgehung besteht darin, sich anzumelden und sofort ein virtuelles Terminal (z. B. tmux) zu starten . Wenn die Verbindung getrennt wird, wird die Shell, in der Sie sich befinden, beendet. Sie können jedoch eine neue Shell öffnen und die Verbindung zum virtuellen Terminal (auf dem die Shell ausgeführt wird, in der Sie gerade arbeiten) wiederherstellen.

William Pursell
quelle
Okay. es ist jetzt klar.
Unter der Annahme , der yum Prozess läuft noch (nicht sofort beenden , wenn die Schale SIGHUP bekommt), reptyr oder ähnlich könnte ausreichend sein , um den Prozess zu erholen oder --failing dass-- jede zukünftige Ausgabe zu erhalten. Die Shell wird jedoch im Allgemeinen beim Trennen der Verbindung beendet.
Eroen
@Eroen Du meinst, auch wenn du tmux verwendest, wird das Betriebssystem den tmux-Prozess beenden, sobald es feststellt, dass die Verbindung unterbrochen ist?
Dojo
@Dojo Wenn die Verbindung beendet wird, wird die tmux-Instanz gestoppt, aber die tmux-Sitzung (und die von ihr verwalteten Shells) bleiben aktiv.
William Pursell
Wenn der Benutzer die Verbindung zum Remote-SSH-Server verloren hat, weil er beispielsweise plötzlich versehentlich das RJ-45-Kabel abgezogen hat, behält der SSH-Server diese Sitzung meines Erachtens bis zu einem vordefinierten Zeitlimit (z. B. 120 Sekunden) bei. Gibt es in diesem Fall eine Möglichkeit, diese Sitzung, die auf der SSH-Serverseite noch aktiv ist, innerhalb von 120 Sekunden nach dem Abziehen des Kabels wieder aufzunehmen?
Gab 是 好人
8

Wie William sagte, ist die kurze Antwort nein, es gibt keinen Weg. Um dies zu verhindern, können Sie den Befehl screen verwenden, bevor Sie die Verbindung verlieren

Nicholas Smith
quelle
von dem, was ich verstehe, müsste ich yum mit screen initiiert haben ... nun ja, das habe ich nicht. Ich kann es nicht wiederholen, wenn es sagt, dass es immer noch benutzt wird und ich es nicht zwingen will, es zu töten. ..wie kann ich die Kontrolle über das laufende yum wiedererlangen?
und byobu ist eine schöne Ergänzung zu dem Bildschirm, um es zu bekommen automatisch in einem netten grafischen Terminal gestartet launchpad.net/byobu
Soweit ich weiß, können Sie das nicht, es sei denn, es gibt eine versteckte Möglichkeit, die Ausgabe des Befehls yum in Ihre aktuelle Unterrichtssitzung umzuleiten, aber ich kann mir keine vorstellen.
Nicholas Smith
Hierfür gibt es eine Reihe von Teillösungen mit Debuggern & c. Um einem Prozess eine neue übergeordnete Shell zu geben. Reptyr ist eines davon, und in einem Blogbeitrag werden das Problem, die Problemumgehung und einige andere Implementierungen beschrieben.
Eroen
3

Nein, Sie können eine Shell nach einer Unterbrechung nicht wiederherstellen. Stattdessen können Sie sicherstellen, dass der von Ihnen ausgeführte Befehl auch nach dem Trennen der Verbindung ausgeführt wird.

Verwenden Sie dazu die Befehle "nohup" und "disown", die normalerweise in den meisten Shells enthalten sind, dh, Sie müssen nichts installieren. Dies funktioniert jedoch nur bei nicht interaktiven Befehlen.

Die Schritte wären also wie folgt:

  1. Loggen Sie sich auf dem Server ein
  2. Führen Sie den Befehl "nohup sudo yum update &" aus (dies protokolliert auch alle Ausgaben in der Datei nohup.out in Ihrem aktuellen Verzeichnis).
  3. Führe "disown% 1" aus
  4. Fühlen Sie sich frei, an dieser Stelle die Verbindung zu trennen, oder warten Sie, bis die Verbindung getrennt wird :)

Wenn Sie zum Server zurückkehren, rufen Sie einfach "tail nohup.out" auf, um zu sehen, wie der Befehl ausgeführt wird.

Zygis
quelle
Würde das im Allgemeinen nicht ziemlich schlecht funktionieren ? Zum Beispiel mit Befehlen, die zu einem bestimmten Zeitpunkt eingegeben werden sollen ... Bei vollständig nicht interaktiven Befehlen funktioniert dies möglicherweise gut genug und vermeidet den Overhead eines Terminal-Multiplexers (und muss möglicherweise installiert werden).
ein Lebenslauf vom
Ja, dies funktioniert nur, wenn Ihre Befehle keine Benutzereingaben erfordern. Ich habe die Antwort aktualisiert. Insgesamt ist ein Terminal-Multiplexer der richtige Weg, aber es wurde erwähnt, dass keine zusätzlichen Werkzeuge installiert werden dürfen.
Zygis
Absolut, es ist eine gültige Antwort, die in ihren möglichen Anwendungsfällen nur geringfügig eingeschränkt ist. Upvoted with the edit.
ein Lebenslauf vom
3

Jemand hat reptyr in einem Kommentar hinzugefügt und nicht in einer Antwort, daher kann ich es nicht empfehlen, aber es scheint eine gute Antwort auf die bearbeitete Frage zu sein und hat in CentOS hervorragend funktioniert.

siehe: https://github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-running-process-new-terminal/

Gibt es eine Möglichkeit, meine unterbrochenen Sitzungen wiederherzustellen, nachdem ich die Verbindung wiederhergestellt habe?

BEARBEITEN: Ich aktualisiere und installiere mit yum und mache mir Sorgen, dass dies ein Problem sein könnte, wenn Prozesse in der Mitte von allem, was sie tun, hängen bleiben.

Aus diesem Grund habe ich die Remote-Verbindung zu einer YUM-Update-Sitzung verloren. Also habe ich nach dieser Frage gesucht und sie gefunden. Dann habe ich sie wieder angeschlossen und diesmal den Bildschirm verwendet:

  1. ssh wieder verbinden
  2. Bildschirm
  3. Installieren Sie Reptyr wie oben beschrieben
  4. ps -a | grep yum
  5. Reptyr psid

und da bin ich bei der wiederhergestellten Eingabeaufforderung, die Yum einige Stunden zuvor gegeben hat.

Technisch gesehen sind alle Antworten korrekt. Dies ist KEINE Wiederherstellung einer unterbrochenen Sitzung, sondern die Wiederherstellung eines verwaisten Prozesses für die aktuelle Sitzung. Und sehr nützlich ist es auch ...

Ingleno
quelle
1

Wie viele Leute vorgeschlagen haben screenund tmux, unterstützen beide grundlegende Funktionen, haben jedoch unterschiedliche spezifische Merkmale, so dass man nicht sagen kann, dass man in allen Fällen dem anderen überlegen ist. Zum Beispiel unterstützt nur tmux Window-Splitting , während nur GNU-Bildschirme den Zeilenumbruch mit (Strg + Ar) umschalten können . Siehe detaillierter Vergleich hier .

Es gibt auch spezielle Tools, um dieses Problem von ssh zu beheben:

Autossh ist ein Programm zum Starten und Überwachen einer Kopie von ssh, das bei Bedarf neu gestartet wird, falls es abstürzt oder keinen Datenverkehr mehr durchläuft. Die Idee kommt von rstunnel.

Mosh ist eine Remote-Terminal-Anwendung, die Roaming ermöglicht, intermittierende Konnektivität unterstützt und eine intelligente lokale Echo- und Leitungsbearbeitung von Benutzertastenanschlägen ermöglicht. Mosh ist ein Ersatz für SSH. Es ist robuster und reaktionsschneller, insbesondere über Wi-Fi, Mobilfunk und Fernverbindungen.

Jaroslaw Nikitenko
quelle
-1

Dies kann mit der tmuxShell geschehen . Wenn die Verbindung getrennt wird, können Sie am schnellsten eine Sitzung wieder herstellen:

tmux a #0
cmcginty
quelle
Dies fügt nichts hinzu, was die akzeptierte Antwort nicht sagt. Es wird außerdem davon ausgegangen, dass auf dem Benutzer bereits eine tmuxSitzung ausgeführt wird.
Kusalananda
2
Dies könnte ein Kommentar zu dieser Antwort sein, in dem "Sie können abkürzen attachals a" steht.
Jeff Schaller