Frage Befehl "Fortsetzen" wird in einer abgelegten SSH-Sitzung ausgeführt


lesen diese Frage brachte mich dazu, mich zu wundern. Angenommen screen wird nicht verwendet. Wenn eine SSH-Sitzung auf einem Linux-Ziel aus irgendeinem Grund unterbrochen wird und Sie die Verbindung wiederherstellen, bevor der Server die Sitzung wegen Zeitüberschreitung beendet, ist es möglich, die Kontrolle über den ausgeführten Befehl wiederzuerlangen, so dass er wegen der unterbrochenen Sitzung nicht abgebrochen wird ?


29
2018-02-23 21:03


Ursprung


Welcher Befehl ist es? Ich vermute, im Allgemeinen ist die Antwort nein. - davr
Kein bestimmter Befehl, ich frage nur nach einem allgemeinen Konzept. - John Gardeniers
Jemand mit einem umfassenden Verständnis darüber, wie die Sitzungen initialisiert werden, könnte uns sagen, wie. Es sieht so aus, als ob Sie eine neue Sitzung auf demselben TTY erstellen und die vorherige PPID explizit zuordnen könnten. Ich warte nur darauf, dass ein bärtiger Nix-Guru kommt und uns in die Luft jagt. Das ist der Traum auf jeden Fall. - CarpeNoctem
Was passiert, wenn Sie mit einem angebundenen Laptop experimentieren und das Ethernetkabel herausziehen? - Paul
@ ~ drpaulbrewer - Genau das gleiche wie wenn du das mit einem Desktop-Rechner machst - die Verbindung wird unterbrochen. Wie die Verbindung unterbrochen wird, ist für die Frage irrelevant. - John Gardeniers


Antworten:


Der Versuch, die aktuellen STD * -Dateideskriptoren eines neuen Terminals mit einem alten laufenden Prozess zu verbinden, verlangt nur nach Schwierigkeiten. Dieser 100 100 100 sch 100 sch 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 sch sch 100 100 100 100 sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch dieser Sie werden ein Durcheinander zurücklassen, wenn Sie das übernommene Programm schließlich verlassen, und was passiert mit der Shell, die ihre Dateideskriptoren geopfert hat, um sie dem neu hinterlegten Prozess zu übergeben. Wird ssh offen bleiben, wenn diese Shell verschwindet? Wahrscheinlich nicht. Du musst es also zuerst woanders umleiten.

Möglich oder nicht, würde ich wetten, dass es mehr wünschenswert ist, den aufgegebenen Prozess "natürlich" töten zu lassen. Wenn Sie etwas tun, das wichtig genug ist, um den Versuch zu unternehmen, alle Hacker-Angriffe durchzuführen, um die Kontrolle wieder aufzunehmen und Sie sind auf einem instabilen Link, sollten Sie wahrscheinlich wissen, dass im Voraus und einfach Bildschirm (oder vnc, oder was auch immer schwimmt Ihr Boot freistehende Steuerung) verwenden. :)


11
2018-02-26 23:33



Ich finde es schwierig, eine Antwort zu akzeptieren, also akzeptiere ich diese, weil es zu diesem Zeitpunkt die einzige ist, die eine Verbesserung hat. - John Gardeniers


Im Allgemeinen ist der richtige Weg, dies zu tun, mit GNU im Voraus vorzubereiten screen oder Bashs nohup oder disown Mechanismen. Wenn Sie verwenden tcshDie Shell verleugnet Hintergrundjobs, wenn sie abnormal beendet wird.

Wenn Sie nicht verwenden screen aber es ist Ihnen gelungen, Ihren Prozess über eines der verleugnen Methoden, können Sie möglicherweise fälschen mit dem Prozess erneut verbinden gdb (Quelle):

[...] mit ein paar schmutzigen Hacks ist es nicht   unmöglich, einen Prozess wieder zu eröffnen "   stdout / stderr / stdin. [...]

Und dann benutze gdb zum Beispiel   an den Prozess anhängen, etwas tun   Ruf schließen (0)
  anrufen schließen (1)
  Anruf schließen (2)
  Aufruf offen ("/ dev / pts / xx", ...)
  Ruf dup (0)
  Ruf dup (0)
  ablösen

Jetzt müssten Sie diesen Prozess für Ihre Situation optimieren. Ich bezweifle, dass es helfen würde, wenn Sie es nicht geschafft haben verleugnen der Prozess. Wenn du es benutzt bash, Siehe diesen Beitrag über das Machen bash automatisch verleugnen Hintergrundprozesse beim Beenden (grundsätzlich ausschalten huponexit mit Einkaufen). Bei einem Vordergrundprozess müssen Sie verwendet haben Nohup.


4
2018-02-25 04:32





Ich weiß, dass dies eine alte Frage ist, aber ich habe das Gefühl, dass es wichtig ist, meine Ergebnisse hinzuzufügen, falls jemand anders auf mich stößt.

Ich habe keine ungewöhnlichen Konsequenzen für dieses Ja gesehen, aber das habe ich benutzt und es hat unglaublich funktioniert. Manchmal, wenn wir lange Prozesse auf unserem Server ausführen, wird die ssh-Sitzung gelegentlich getrennt. Der Prozess scheint zusammen mit der tty-Sitzung weiter zu laufen, aber wir können die Verbindung nicht wiederherstellen. Ich habe das folgende Programm gefunden, um den Prozess in die neu verbundene Sitzung zu ziehen.

https://github.com/nellhage/reptyr

Hier finden Sie weitere Informationen

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


4
2018-04-03 20:49



Willkommen bei Serverfehler! Während dies theoretisch die Frage beantworten könnte, es wäre vorzuziehen um die wesentlichen Teile der Antwort hier einzubeziehen und den Link als Referenz bereitzustellen. - EEAA


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

Eine Sache ist das Fehlen des Tötens der Shell und möglicher Befehle, die als Folge der Beendigung der SSH-Verbindung ausgeführt werden. Dies ist nicht so schwierig, Sie sollten nohup und ähnliche Mechanismen wie in der anderen Frage erwähnt verwenden können.

Aber nimm an, dass du angefangen hast ssh somehost nuhup vim /some/file und die Verbindung stirbt. Sie laufen ssh somehost um sich erneut anzumelden und zu sehen, dass der vim-Prozess noch läuft. Aber wie verbinden Sie sich wieder mit diesem Prozess? Interaktive Forground-Prozesse haben ein Controlling tty und derjenige, der für deinen vim-Prozess geöffnet wurde, als er begann, wäre seitdem geschlossen worden. Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, sie in Ihrer neuen Shell wieder zu öffnen (so als ob Sie mehrere Hintergrundjobs in einer Shell ausführen würden, die Sie nicht in einer anderen Shell erstellen können).

Screen wurden explizit geschrieben, um diese Funktionalität zu haben. Beim Start gibt es zwei Prozesse, einen Terminal-Management-Prozess und einen Client-Prozess. Die Interaktion ist Client <-> Terminal-Manager <-> Anwendung, und wenn Sie die Verbindung trennen oder verlieren, stirbt der Client-Prozess, während der Terminal-Manager weiterlebt. Der Bildschirm hat einige spezifische Unterstützung, die später wieder an den Terminalverwaltungsprozess angehängt werden kann, und ich denke nicht, dass dies im allgemeinen Fall möglich ist.


1
2018-02-23 23:55



Vielen Dank. Das ist ziemlich genau das, was ich erwartet habe. Mal sehen, ob jemand uns falsch beweisen kann. ;) - John Gardeniers
Seit ich diese Antwort geschrieben habe, habe ich gelernt, dass es ein Programm gibt Reptyr für "re-ptying" Prozesse. Also in der Theorie machbar, aber ich denke immer noch, dass die allgemeine Antwort wahrscheinlich nicht ist. - hlovdal


Rette könnte Ihnen helfen, aber die Disclaimer sind sehr real und relevant :)


1
2018-02-25 03:41





Ob Session wird gelöscht, es bedeutet, dass TTL bereits abgelaufen ist, also gibt es kein mehr für Sie (wie ich es verstehe). Wenn jedoch Ihre Netzwerkverbindung unterbrochen ist, muss Ihre SSH-Sitzung möglicherweise nicht unterbrochen werden, und Sie sollten in der Lage sein, die Verbindung fortzusetzen und fortzufahren. Ist es das wonach Sie fragen?


1
2018-02-27 00:38



Ich habe generell gefragt, aber am meisten interessiert mich, wenn ein Netzwerkproblem dazu führt, dass eine Verbindung unterbrochen wird. Insgesamt würde ich sagen, es sieht nicht gut aus. Dies wurde jedoch nur aus Neugier und nicht aus Notwendigkeit gefragt. Es ist immer schön, die Antwort zu kennen, bevor Sie sie brauchen. ;) - John Gardeniers
Eine unterbrochene Verbindung ist nicht so einfach, wie es scheint. Sie könnten verschiedene Stufen davon erfahren. Zum Beispiel sollten Sie in der Lage sein, Ihr Netzwerkkabel zu entfernen, es in ein paar Sekunden wieder zu verbinden, und Ihre SSH-Sitzung bleibt aufrecht, Sie müssen nicht erneut verbinden, um fortzufahren, auch wenn Sie eine kurze anfängliche Verzögerung erfahren könnten. Wenn Sie sich in einer getöteten SSH-Sitzung befinden, bedeutet dies, dass etwas falsch konfiguriert ist (oder eher nicht richtig konfiguriert ist, um diese Art von Störung zu unterstützen). - monomyth


Es gab eine Verbindung zu irgendeinem Hacky Code, der in gestohlen wird diese Frage. Sie sollten theoretisch in der Lage sein, dies zu nutzen, um die Kontrolle über einen Nohup-Prozess wieder zu erlangen.


0
2018-02-24 00:58



Das in den Antworten auf diese Frage erwähnte Verweigerungskommando ist ebenfalls eine weitere Untersuchung wert. Vielen Dank. - John Gardeniers