Ekran GNU - Nie można połączyć się ponownie z ekranem po utracie połączenia

23

Używałem irssi na ekranie, ale straciłem połączenie. Po ponownym zalogowaniu się na serwerze nie mogę już dołączyć do tego ekranu. screen -ls pokazuje, że ekran jest już podłączony.

Próbowałem screen -D, aby wymusić odłączenie, i powiedział: odłącz, ale screen -ls wciąż mówi, że jest podłączony. Próbowałem screen -x i po prostu się tam wisi.

[sub@server ~]$ screen -ls 
There are screens on:
 4033.poe (Detached)
 7728.irssi (Attached)
2 Sockets in /var/run/screen/S-sub.

Co mogę teraz zrobić?

subhashish
źródło

Odpowiedzi:

14

Jeśli próbujesz połączyć ekran „Dołączony”, uruchom screen -xr irssi. Wielkie litery „-X” wysyłają polecenie do jednej z sesji ekranowych, a mała litera „-x” pozwala ponownie połączyć się z dołączoną sesją. Ale nadal musisz podać nazwę sesji, ponieważ jest więcej niż jedna.

Arcege
źródło
9

Wyczyściłem to zachowanie w przeszłości, zabijając powłokę, która rozpoczęła sesję screena. Zasadniczo zabijanie wszystkich instancji bash dla mojego użytkownika, które nie były własnością screena.

DRZEWO
źródło
2
Próbowałem wszystkich wymienionych tutaj opcji (-RD, -xr) i nie udało się odzyskać sesji. W końcu zabiłem sesję SCREEN, znajdując ją (ps -ef | grep bash).
so_mv
4

Nadałeś mu nazwę inną niż domyślna. Spróbuj tego:screen -RD irssi

Keith
źródło
2
mam podobny problem, ale ekran -RD <nazwa> nadal się zawiesza ... :-(
harald
4

możesz spróbować:

#Reattach a session and if necessary detach it first.
screen -d -r 7728.irssi  

#Reattach a session. If necessary detach and logout remotely first.
screen -D -r 7728.irssi

zawsze dobrym pomysłem jest użycie pełnej nazwy pid.tty

Agomezl
źródło
3

screenjest znany z tego, że nie jest kompatybilny wstecz między wersjami. Jeśli wersja screenzostała zaktualizowana na serwerze, możliwe, że nie będzie można ponownie podłączyć się do starszych sesji ekranowych.

W takim przypadku możesz albo użyć starego pliku binarnego SCREEN, aby ponownie podłączyć (pod warunkiem, że gdzieś go zapisał menedżer pakietu dystrybucyjnego), lub całkowicie zabić sesję.

parasietje
źródło
2

Odniosłem pewien sukces, wysyłając proces GNU / screen SIGCHLD (który normalnie odbiera, gdy okno jest zamknięte), co zmusza go do dotknięcia (i ewentualnie odtworzenia) pliku gniazda.

Zauważ również, że istnieją dwa sposoby na wywołanie screenpliku wykonywalnego, które różnią się tylko w przypadku: SCREENjest to komponent po stronie serwera, z którym próbujesz się ponownie połączyć, podczas gdy screenpo stronie klienta tasuje dane między twoim terminalem a stroną po stronie serwera. Więc możesz spróbować zabić małą literę ...

Na przykład poniżej widać, że moje screeni SCREENprocesy nie są uważane za nadrzędne i podrzędne, co wskazuje, że dołączyłem do istniejącej sesji.

# ps fao pid,command
25070 SCREEN -U
25071  \_ vim +let &t_Co=256
25073  \_ -bash
25077  \_ -bash
...
18364  \_ sshd: username [priv]
18366  |   \_ sshd: username@pts/17
18367  |       \_ -bash
  870  |           \_ screen -U -x

Świeże sesje wyglądają mniej więcej tak:

19645  |  \_ screen -S MySession
19646  |      \_ SCREEN -S MySession
19647  |          \_ bash
 1485  |          |   \_ python
19700  |          \_ bash
RobM
źródło
Jak wysłać SIGCHILD?
giorgio79
1
Użyj tak nazwanej killkomendy w następujący sposób: kill -s SIGCHLD <PID>gdzie <PID>jest numer identyfikatora procesu (najbardziej lewa kolumna w moim przykładowym wyniku)
RobM
1

Zdarzyło mi się to, gdy korzystałem z vi, gdy sesja zamarła, a ja się rozłączyłem. Podczas próby ponownego podłączenia do ekranu za pomocą screen -Arx proces po prostu się zawiesił.

Może być uruchomiony podobny proces potomny powodujący zawieszenie się ekranu. Jeśli przypomnisz sobie jedno, na którym się szczególnie skupiasz, w przeciwnym razie, aby uzyskać listę procesów potomnych uruchomionych pod twoim ekranem, wykonaj:

ps ux -H

Które pokażą zagnieżdżone procesy potomne:

zwood    28481  0.0  0.0 101148  8844 ?        Ss   Oct07   1:36 SCREEN -S mysession
zwood    28482  0.0  0.0  67436  1744 pts/2    Ss+  Oct07   0:00   /bin/bash
zwood    28515  0.0  0.0  67556  1876 pts/4    Ss+  Oct07   0:00   /bin/bash
zwood     4498  0.0  0.0  67436  1772 pts/5    Ss   Oct07   0:00   /bin/bash
zwood     2007  0.0  0.0  73604  1324 pts/5    S+   15:47   0:00     vi /home/zwood/.bashrc.custom
zwood    14670  0.0  0.0  67436  1768 pts/13   Ss+  Oct14   0:00   /bin/bash
zwood    27002  0.0  0.0  67436  1720 pts/11   Ss+  Oct20   0:00   /bin/bash
zwood    24748  0.0  0.0  67432  1712 pts/14   Ss+  Oct21   0:00   /bin/bash

Po zabiciu procesu vi, który spowodował problem, mogłem ponownie podłączyć ekran bez żadnych problemów. Dobrym pomysłem jest również zabicie wszystkich wcześniejszych procesów, które zostały ponownie podłączone do ekranu. Po prostu użyj:

kill -9 <pid>

Nie wiem, co robi ekran wewnętrznie, dlaczego vi spowodowało zawieszenie się ekranu, ani dlaczego zabicie procesu vi przywróciło mój ekran. W przeszłości miałem ten problem z ekranem i próbowałem bez powodzenia tego, co większość ludzi polecała w tym wątku. Znalezienie tego problemu proces potomny jest jedyną rzeczą, która działała dla mnie i działała konsekwentnie.

Hazok
źródło
Jedyne, co mnie uratowało, to zabójczy proces pod ekranem. Wolę stracić wiele procesów pod ekranem niż stracić całą sesję ekranu!
Yonatan
0
screen -r 4033

screen -x 7728
Eduardo
źródło
0
killall -9 sshd

To zadziałało dla mnie. Miałem 3 różne ekrany i straciłem 3 różne połączenia ssh. Po ponownym połączeniu ekrany były nadal podłączone, wydałem polecenie powyżej ... oczywiście straciłem obecne połączenie, ale było nowe. Przy następnym ponownym podłączeniu każdy ekran został odłączony.

Uwaga: jeśli jesteś superużytkownikiem, powinieneś użyć --useropcji, aby zabić tylko swoje demony ssh.

frncmx
źródło