Befehl fortsetzen, der in einer unterbrochenen SSH-Sitzung ausgeführt wird


32

Als ich diese Frage las, wunderte ich mich. Angenommen, es screenwird nicht verwendet. Wenn eine SSH-Sitzung auf einem Linux-Ziel aus irgendeinem Grund beendet wird und Sie die Verbindung erneut herstellen, bevor der Server die Sitzung aufgrund eines Zeitlimits beendet, kann die Steuerung des ausgeführten Befehls wiederhergestellt werden, sodass er aufgrund der unterbrochenen Sitzung nicht abgebrochen wird ?


Welcher Befehl ist das? Ich vermute, im Allgemeinen ist die Antwort nein.
Davr

Kein besonderes Kommando, ich frage nur als allgemeines Konzept.
John Gardeniers

1
Jemand, der ein umfassendes Verständnis dafür hat, wie tty-Sitzungen initialisiert werden, kann uns möglicherweise mitteilen, wie. Scheint, als ob Sie eine neue Sitzung auf der gleichen Tty erstellen und die vorherige PPID explizit zuweisen könnten, was möglich sein könnte. Ich warte nur darauf, dass ein bärtiger Nix-Guru kommt und uns um den Verstand brennt. Das ist auf jeden Fall der Traum.
CarpeNoctem

Was passiert, wenn Sie mit einem angeschlossenen Laptop experimentieren und das Ethernetkabel herausziehen?
Paul

@ ~ drpaulbrewer - Genau wie bei einem Desktop-Computer - die Verbindung wird getrennt. Wie die Verbindung getrennt wird, ist für die Frage unerheblich.
John Gardeniers

Antworten:


13

Der Versuch, die aktuellen STD * -Dateideskriptoren eines neuen Terminals mit einem alten laufenden Prozess zu verbinden, ist nur problematisch. Selbst wenn Sie das schaffen, funktioniert die Auftragssteuerung des Terminals nicht wie erwartet. Sie werden ein Durcheinander hinterlassen, wenn Sie das übernommene Programm beenden und was mit der Shell passiert, die ihre Dateideskriptoren geopfert hat, um an den neu hinterlegten Prozess übergeben zu werden. Wird ssh offen bleiben, wenn diese Hülle verschwindet? Wahrscheinlich nicht. Sie müssen es also zuerst an eine andere Stelle umleiten.

Möglich oder nicht, ich würde wetten, dass es wünschenswerter ist, den abgebrochenen Prozess "natürlich" töten zu lassen. Wenn Sie irgendetwas tun, das wichtig genug ist, um zu rechtfertigen, dass Sie versuchen, alle zur Wiederaufnahme der Kontrolle erforderlichen Aktionen auszuführen, und sich auf einer instabilen Verbindung befinden, sollten Sie dies wahrscheinlich im Voraus wissen und einfach den Bildschirm (oder VNC) verwenden, oder was auch immer auf Ihrem getrennten Computer schwebt. Steuerboot). :)


Es fällt mir schwer, eine Antwort zu finden, die ich akzeptieren möchte. Deshalb akzeptiere ich diese Antwort, weil sie derzeit die einzige ist, die eine Gegenstimme hat.
John Gardeniers

5

Ich weiß, dass dies eine alte Frage ist, aber ich war der Meinung, dass es wichtig ist, meine Erkenntnisse hinzuzufügen, falls jemand anderes so auf mich stößt wie ich.

Ich habe keine ungewöhnlichen Konsequenzen dafür gesehen, ja, aber das habe ich benutzt und es hat erstaunlich funktioniert. Manchmal, wenn wir lange Prozesse auf unserem Server ausführen, wird die SSH-Sitzung gelegentlich getrennt. Der Prozess zusammen mit der tty-Sitzung scheint weiterhin ausgeführt zu werden, es kann jedoch keine erneute Verbindung hergestellt werden. Ich fand das Programm unten, um den Prozess zur neu verbundenen Sitzung zu ziehen.

https://github.com/nelhage/reptyr

Hier gibt es mehr Infos

https://blog.nelhage.com/2011/02/changing-ctty/


5
Willkommen bei Server Fault! Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
EEAA

danke, @ user215086! Überraschenderweise hat das funktioniert! Ich bearbeitete eine Weile eine lange Konfigurationsdatei, fügte eine Reihe von benutzerdefinierten Einstellungen und sorgfältig geschriebenen Kommentaren hinzu und war fast fertig, als die Verbindung unterbrochen wurde! "Noooooo !! ..." Nachdem ich mit dem Schreien an der Decke fertig war, installierte ich Reptyr et voila! Ich habe die SSH-Sitzung genau dort wiederhergestellt, wo ich sie noch im Editor gelassen habe, ein paar Dinge erledigt, gespeichert und fertig !! WooHoo! Reptyr ist fantastisch.
ColdCold

4

Im Allgemeinen ist die richtige Vorgehensweise, sich mit GNU, screenBash nohupoder disownMechanismen im Voraus darauf vorzubereiten . Wenn Sie verwenden tcsh, zeigt die Shell beim abnormalen Beenden Hintergrundjobs nicht an.

Wenn Sie nicht verwenden, es screenaber geschafft haben, Ihren Prozess über eine der nicht verfügbaren Methoden am Laufen zu halten , können Sie möglicherweise vortäuschen, dass Sie mit gdb( source ) erneut eine Verbindung zum Prozess hergestellt haben :

[...] mit einigen schmutzigen Hacks ist es nicht unmöglich, einen Prozess 'stdout / stderr / stdin' erneut zu öffnen. [...]

Und dann benutze gdb zum Beispiel um eine Verbindung zum Prozess herzustellen, mache einen Aufruf zum Schließen (0),
rufe zum Schließen (1),
rufe zum Schließen (2),
rufe zum Öffnen ("/ dev / pts / xx", ...),
rufe dup (0) auf.
call dup (0)
detach

Jetzt müssten Sie diesen Prozess für Ihre Situation optimieren. Ich bezweifle, dass es helfen würde, wenn Sie es nicht geschafft haben, den Prozess zu missbilligen . Wenn Sie verwenden bash, finden Sie in diesem Beitrag zu machen bash automatisch disown Hintergrundprozesse auf Exit (grundsätzlich ausschalten huponexit mit shopt ). Bei einem Vordergrundprozess muss nohup verwendet werden .


1

Wahrscheinlich nicht. Ich kann nicht garantieren, dass es unmöglich ist, aber ich bezweifle es wirklich.

Eine Sache ist, dass die Shell nicht beendet werden kann und mögliche Befehle als Folge der Beendigung der ssh-Verbindung ausgeführt werden. Dies ist nicht so schwierig, Sie sollten in der Lage sein, keine Up- und ähnliche Mechanismen zu verwenden, wie in der anderen Frage erwähnt.

Angenommen, Sie haben begonnen ssh somehost nuhup vim /some/fileund die Verbindung wird unterbrochen. Sie starten, ssh somehostum sich erneut anzumelden, und können feststellen, dass Ihr vim-Prozess noch ausgeführt wird. Aber wie stellen Sie wieder eine Verbindung zu diesem Prozess her? Interaktive forground-Prozesse haben ein Kontroll- Tty und dasjenige, das für Ihren vim-Prozess geöffnet wurde, als er gestartet wurde, wäre seitdem geschlossen worden. Ich bin nicht sicher, ob es eine Möglichkeit gibt, es in Ihrer neuen Shell erneut zu "öffnen" (genau wie wenn Sie mehrere Hintergrundjobs in einer Shell ausführen, können Sie keine der Jobs in einer anderen Shell in den Vordergrund stellen).

Screenwurden ausdrücklich geschrieben, um diese Funktionalität zu haben. Beim Start gibt es zwei Prozesse, einen Terminalverwaltungsprozess und einen Clientprozess. Bei der Interaktion handelt es sich um die Anwendung Client <-> Terminal-Manager <->. Wenn Sie die Verbindung trennen oder verlieren, wird der Client-Prozess beendet, während der Terminal-Manager weiterhin aktiv ist. Bildschirm haben eine bestimmte Unterstützung, um später wieder an den Terminal-Verwaltungsprozess anzuhängen, und ich glaube nicht, dass dies im allgemeinen Fall möglich ist.


Vielen Dank. Das ist so ziemlich das, was ich erwartet hatte. Mal sehen, ob jemand uns das Gegenteil beweisen kann. ;)
John Gardeniers

Ich habe seit dem Schreiben dieser Antwort erfuhr , dass es ein Programm ist reptyr für „re-ptying“ Prozesse. Also theoretisch machbar, aber ich denke immer noch, die allgemeine Antwort ist wahrscheinlich nicht.
hlovdal


1

Wenn die Sitzung abgebrochen wird, bedeutet dies, dass TTL bereits abgelaufen ist, sodass für Sie kein tty mehr vorhanden ist (so wie ich es verstehe). Wenn Ihre Netzwerkverbindung jedoch unterbrochen wird, muss Ihre SSH-Sitzung möglicherweise nicht unterbrochen werden, und Sie sollten in der Lage sein, Ihre Verbindung wieder aufzunehmen und fortzufahren. Fragen Sie danach?


Ich habe allgemein gefragt, bin aber am meisten daran interessiert, wann ein Netzwerkproblem dazu führt, dass eine Verbindung unterbrochen wird. Insgesamt würde ich sagen, dass es nicht allzu gut aussieht. Trotzdem wurde dies nur aus Neugier gefragt, anstatt es zu brauchen. Es ist immer schön, die Antwort zu kennen, bevor Sie sie brauchen. ;)
John Gardeniers

Eine unterbrochene Verbindung ist anscheinend kein einfaches Konzept. Sie können verschiedene Stadien davon erleben. Zum Beispiel sollten Sie in der Lage sein, Ihr Netzwerkkabel abzuziehen, es in ein paar Sekunden wieder anzuschließen, und Ihre SSH-Sitzung bleibt bestehen, Sie müssen keine erneute Verbindung herstellen, um fortzufahren, obwohl Sie möglicherweise eine kurze anfängliche Verzögerung bemerken. Wenn Sie sich in einer getöteten SSH-Sitzung befinden, bedeutet dies, dass etwas falsch konfiguriert ist (oder nicht richtig konfiguriert wurde, um diese Art von Störung zu unterstützen).
Monomythos

0

In dieser Frage gab es einen Link zu einem Hacky-Tty-Diebstahl-Code . Sie sollten theoretisch in der Lage sein, die Kontrolle über einen Nohup-Prozess zurückzugewinnen.


1
Der in den Antworten auf diese Frage erwähnte Befehl disown ist ebenfalls eine weitere Untersuchung wert. Vielen Dank.
John Gardeniers
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.