Als ich diese Frage las, wunderte ich mich. Angenommen, es screen
wird 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 ?
32
Antworten:
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). :)
quelle
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/
quelle
Im Allgemeinen ist die richtige Vorgehensweise, sich mit GNU,
screen
Bashnohup
oderdisown
Mechanismen im Voraus darauf vorzubereiten . Wenn Sie verwendentcsh
, zeigt die Shell beim abnormalen Beenden Hintergrundjobs nicht an.Wenn Sie nicht verwenden, es
screen
aber geschafft haben, Ihren Prozess über eine der nicht verfügbaren Methoden am Laufen zu halten , können Sie möglicherweise vortäuschen, dass Sie mitgdb
( source ) erneut eine Verbindung zum Prozess hergestellt haben :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 .quelle
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/file
und die Verbindung wird unterbrochen. Sie starten,ssh somehost
um 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).Screen
wurden 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.quelle
retty kann dir vielleicht helfen, aber die Haftungsausschlüsse sind sehr real und relevant :)
quelle
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?
quelle
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.
quelle