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 .