Jak ponownie połączyć się z utraconym ekranem (odłączonym, brakującym gniazdem)?

23

Miałem screensesję działającą na serwerze domowym. Moja stacja robocza wymagała ponownego uruchomienia, więc odłączyłem terminal i zabiłem go. Po ponownym połączeniu z serwerem wykonuję mój typowy

$ screen -D -R
[new screen]

Co? Nie, nie nowa sesja, daj mi starą. Wiem, wezmę to bezpośrednio. Jaka jest nazwa gniazda?

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

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

Czekaj, co? Wiem, że zostawiłem to uruchomione. Gdzie to poszło?

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

Cóż, jest proces. Ale nie ma gniazda do przekazania screen -r. Jak mogę ponownie dołączyć do sesji?

quack quixote
źródło

Odpowiedzi:

28

Screensprawdza fifo / gniazdo za każdym razem, gdy odbiera SIGCHLDsygnał. Jeśli brakuje gniazda, zostanie ono odtworzone. Rozwiązaniem jest znalezienie procesu i wysłanie go SIGCHLD.

W moim systemie Debian screenwydaje się być zainstalowany jako setgid, utmpale nie setuid, więc pierwsze rozwiązanie z FAQ poniżej działało:

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

W systemach, w których screen jest zainstalowany setuid root, to nie zadziała i będziesz musiał zabić jeden z procesów potomnych aktywnej sesji screena, aby zmusić jądro do wysłania za ciebie sygnału. Oznacza to poświęcenie jednego z okien ekranu, aby połączyć się z resztą (wybierz mądrze!).

Z archiwum FAQ Gentoo Wiki :

Brak gniazda

Czasami gniazdo wciąż działającego ekranu może zostać zniszczone, chociaż aktualny proces i wszystkie jego procesy potomne są nadal uruchomione. screen -list wyświetli komunikat „Nie znaleziono gniazd w / tmp / uscreens / ..” Kilka przydatnych instrukcji, jak odzyskać to (i kilka innych nietypowych problemów) na stronie http://www4.informatik.uni-erlangen.de/ ~ jnweiger / screen-faq.html # MISC około 2/3 drogi w dół.

P: Z nieznanego powodu zniknęło fifo w / tmp /screen / S-myname i nie mogę wznowić sesji ekranowej. Czy istnieje sposób na odtworzenie FIFO?

Odp .: Ekran sprawdza fifo / gniazdo za każdym razem, gdy odbiera sygnał SIGCHLD. Jeśli go nie ma, odtworzone zostanie fifo / socket.

Jeśli screen działa bez ustawionego identyfikatora użytkownika, użytkownik może wydać kill -CHLD screenpidbezpośrednio ( -CHILDw niektórych systemach). Screenpid to identyfikator procesu screen znajdujący się na ps -xliście.

Ale zazwyczaj to nie działa, ponieważ screen powinien być zainstalowany jako setuid root. W takim przypadku nie będziesz mógł wysłać mu sygnału, ale jądro to zrobi. Robi to za każdym razem, gdy dziecko ekranu zmienia swój stan. Znajdź identyfikator procesu (shellpid poniżej) „najmniej ważnej” powłoki działającej na ekranie. Próba kill -STOP shellpid. Jeśli fifo / socket nie pojawi się ponownie, zniszcz proces powłoki. Poświęcasz jedną skorupę, aby uratować resztę. Jeśli nic nie działa, nie zapomnij usunąć wszystkich procesów działających w sesji utraconego ekranu.

quack quixote
źródło