Wie verbinde ich mich wieder mit einem verlorenen Bildschirm (abgetrennter, fehlender Socket)?


23

Ich hatte eine screenSitzung auf einem Heimserver. Meine Workstation musste neu gestartet werden, daher habe ich das Terminal getrennt und beendet. Wenn ich mich wieder mit dem Server verbinde, führe ich mein Typical aus

$ screen -D -R
[new screen]

Huh? Nein, keine neue Sitzung, gib mir die alte. Ich weiß, ich werde es direkt packen. Wie heißt der Socket?

$ screen -list
No Sockets found in /var/run/screen/S-username

$ ls -a /var/run/screen/S-username
.  ..

Warte was? Ich weiß, ich habe es laufen lassen. Wo ist es hingegangen?

$ ps -ef | grep -i screen
username  30860     1  0 Oct16 ?        00:00:29 SCREEN

Nun, da ist der Prozess. Aber es gibt keine Steckdose screen -r. Wie kann ich meine Sitzung erneut verbinden?

Antworten:


28

ScreenÜberprüft den Fifo / Socket, wann immer er ein SIGCHLDSignal empfängt . Wenn der Socket fehlt, wird er neu erstellt. Die Lösung besteht also darin, den Prozess zu finden und zu senden SIGCHLD.

screenScheint auf meinem Debian-System als setgid, utmpaber nicht als setuid installiert zu sein , so dass die erste Lösung aus den folgenden FAQ funktioniert hat:

$ kill -CHLD 30860
$ ls /var/run/screen/S-username/
30860.pts-4.localhost

Auf Systemen, auf denen screen setuid installiert ist root, funktioniert dies nicht und Sie müssen einen der untergeordneten Prozesse der aktiven Bildschirmsitzung beenden, um den Kernel zu zwingen, das Signal für Sie zu senden. Dies bedeutet, dass Sie eines Ihrer Bildschirmfenster opfern müssen, um die Verbindung mit dem Rest wiederherzustellen (wählen Sie mit Bedacht aus!).

Aus einem archivierten Gentoo Wiki FAQ :

Sockel fehlt

Manchmal kann der Socket eines noch laufenden Bildschirms zerstört werden, obwohl der eigentliche Prozess und alle untergeordneten Prozesse noch ausgeführt werden. Bildschirm -Liste wird „No Sockets gefunden in / tmp / uscreens / ..“ angezeigt Einige handliche Anweisungen, wie aus diesem (und ein paar andere ungewöhnliche Probleme) bei sich erholen http://www4.informatik.uni-erlangen.de/ ~ jnweiger / screen-faq.html # MISC ungefähr 2/3 des Weges nach unten.

F: Aus irgendeinem unbekannten Grund ist das FIFO in / tmp / screens / S-myname weg und ich kann meine Bildschirmsitzung nicht fortsetzen. Gibt es eine Möglichkeit, das FIFA neu zu erstellen?

A: Der Bildschirm überprüft den Fifo / Socket, wenn er ein SIGCHLD-Signal empfängt. Wenn es fehlt, wird das FIFO / Socket dann neu erstellt.

Wenn der Bildschirm ohne set-uid ausgeführt wird, kann der Benutzer kill -CHLD screenpiddirekt eine ausgeben (dies ist -CHILDauf einigen Systemen der Fall ). Screenpid ist die Prozess-ID des in einer ps -xAuflistung gefundenen Bildschirmprozesses .

Normalerweise funktioniert dies jedoch nicht, da screen als setuid root installiert werden sollte. In diesem Fall können Sie kein Signal senden, der Kernel jedoch. Dies geschieht immer dann, wenn ein untergeordnetes Bildschirmelement seinen Status ändert. Suchen Sie die Prozess-ID (Shell-ID unten) der "am wenigsten wichtigen" Shell, die auf dem Bildschirm ausgeführt wird. Der Versuch kill -STOP shellpid. Wenn der FIFO / Socket nicht wieder angezeigt wird, zerstören Sie den Shell-Prozess. Sie opfern eine Muschel, um den Rest zu retten. Wenn nichts funktioniert, vergessen Sie bitte nicht, alle Prozesse zu entfernen, die in der Sitzung für verlorene Bildschirme ausgeführt werden.

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.