GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Fortsetzen des Befehls, der in einer unterbrochenen SSH-Sitzung ausgeführt wird

Lösung 1:

Der Versuch, die aktuellen STD*-Dateideskriptoren eines neuen Terminals mit einem alten laufenden Prozess zu verbinden, verlangt nach Ärger. Selbst wenn Ihnen das gelingt, funktioniert die Jobsteuerung des Terminals nicht wie erwartet. Sie werden ein Durcheinander hinterlassen, wenn Sie das übernommene Programm schließlich beenden, und was mit der Shell passiert, die ihre Dateideskriptoren geopfert hat, um sie an den neu im Hintergrund befindlichen Prozess zu übergeben. Wird ssh geöffnet bleiben, wenn diese Shell verschwindet? Wahrscheinlich nicht. Sie müssen es also zuerst woanders umleiten.

Möglich oder nicht, ich würde wetten, dass es wünschenswerter ist, den abgebrochenen Prozess einfach "natürlich" beenden zu lassen. Wenn Sie etwas tun, das wichtig genug ist, um den Versuch zu rechtfertigen, all die Hackerarbeiten durchzuführen, die erforderlich sind, um die Kontrolle wiederzuerlangen und Sie befinden sich auf einer instabilen Verbindung, Sie sollten das wahrscheinlich im Voraus wissen und einfach screen (oder vnc oder was auch immer Ihr Boot mit freistehender Steuerung schwimmt) verwenden. :)

Lösung 2:

Ich weiß, dass dies eine alte Frage ist, aber ich hielt es für wichtig, meine Erkenntnisse hinzuzufügen, falls jemand anderes so darauf stößt wie ich.

Ich habe keine ungewöhnlichen Konsequenzen gesehen, ja, aber das habe ich verwendet 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 weiter ausgeführt zu werden, aber wir können uns nicht wieder damit verbinden. Ich habe das folgende Programm gefunden, um den Prozess in die neu verbundene Sitzung zu ziehen.

https://github.com/nelhage/reptyr

Hier finden Sie weitere Informationen

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

Lösung 3:

Im Allgemeinen besteht der richtige Weg, damit umzugehen, darin, sich rechtzeitig darauf vorzubereiten, indem man GNU screen verwendet oder nohup von bash oder disown Mechanismen. Wenn Sie tcsh verwenden , verweigert die Shell Hintergrundjobs, wenn sie abnormal beendet wird.

Wenn Sie screen nicht verwenden aber haben es geschafft, Ihren Prozess über einen der disown am Laufen zu halten Methoden können Sie möglicherweise mit gdb eine erneute Verbindung mit dem Prozess vortäuschen (Quelle):

[...] schmutzigen Hacks ist es nicht unmöglich, einen Prozess wie stdout/stderr/stdin wieder zu öffnen. [...]

Und dann verwenden Sie zum Beispiel gdb, um sich an den Prozess anzuhängen, machen Sie irgendeinen Anruf schließen (0)
Anruf schließen(1)
Anruf schließen(2)
call open("/dev/pts/xx", ...)
Call-Dup(0)
Call-Dup(0)
abtrennen

Nun müssten Sie diesen Prozess für Ihre Situation optimieren. Ich bezweifle, dass es helfen würde, wenn Sie es nicht geschafft haben, zu widersprechen der Prozess. Wenn Sie bash verwenden , siehe diesen Beitrag über das Erstellen von bash automatisch verweigern Hintergrundprozesse beim Beenden (grundsätzlich huponexit ausschalten mit shopt ). Bei einem Vordergrundprozess müssen Sie nohup verwendet haben .


Linux
  1. Ssh – Prozesse weiterlaufen lassen, nachdem die Ssh-Sitzung getrennt wurde?

  2. Wie kann ich die Ausgabe eines laufenden Prozesses in einer anderen Bash-Sitzung anzeigen?

  3. Wie setzt man eine Gnome-Sitzung fort?

  4. Ein Python-Programm auch nach dem Abmelden von der SSH-Sitzung weiter ausführen?

  5. Wie kann man feststellen, ob es in einer Linux-Konsole oder in einer SSH-Sitzung ausgeführt wird?

Pstree-Befehl unter Linux

Kill-Befehl unter Linux

SSH-Befehl

Linux-Bildschirmbefehl:Prozesse trotz unterbrochener Verbindung weiterlaufen lassen

Reptyr – Verschieben Sie einen laufenden Prozess von einem Terminal zum anderen, ohne es zu schließen

So finden Sie heraus, wie lange ein Prozess unter Linux läuft