Nie można wznowić ekranu, mówi, że jestem już podłączony?

151

Pracuję na zdalnym serwerze Debian Jessie. Rozpocząłem sesję ekranową, uruchomiłem skrypt, a następnie przerwałem w sieci.

Teraz zalogowałem się ponownie i chcę wznowić sesję.

Oto, co widzę, gdy wyświetlam listę ekranów:

$ screen -ls
There are screens on:
    30608.pts-8.myserver    (11/03/2015 08:47:58 AM)    (Attached)
    21168.pts-0.myserver    (11/03/2015 05:29:24 AM)    (Attached)
    7006.pts-4.myserver (10/23/2015 09:05:45 AM)    (Detached)
    18228.pts-4.myserver    (10/21/2015 07:50:49 AM)    (Detached)
    17849.pts-0.myserver    (10/21/2015 07:43:53 AM)    (Detached)
5 Sockets in /var/run/screen/S-me.

Wydaje mi się, że jestem podłączony do dwóch ekranów jednocześnie.

Teraz chcę wznowić sesję, którą wcześniej prowadziłem, aby zobaczyć wyniki mojego skryptu:

$ screen -r 30608.pts-8.myserver
There is a screen on:
    30608.pts-8.OpenPrescribing (11/03/2015 08:47:58 AM)    (Attached)
There is no screen to be resumed matching 30608.pts-8.myserver.

Dlaczego nie mogę ponownie dołączyć?

Mam ten sam problem z drugim ekranem:

$ screen -r 21168.pts-0.myserver
There is a screen on:
    21168.pts-0.OpenPrescribing (11/03/2015 05:29:24 AM)    (Attached)
There is no screen to be resumed matching 21168.pts-0.myserver.
Richard
źródło

Odpowiedzi:

241

Sesja jest nadal podłączona do innego terminala. Serwer nie wykrył awarii sieci dla tego połączenia: wykrywa awarię tylko podczas próby wysłania pakietu i otrzymuje błąd z powrotem lub brak odpowiedzi po upływie limitu czasu, ale to się jeszcze nie zdarzyło. Jesteś w typowej sytuacji, w której klient wykrył awarię, ponieważ próbował wysłać jakieś dane wejściowe i nie powiódł się, ale serwer po prostu tam siedzi i czeka na dane wejściowe. W końcu serwer wyśle ​​pakiet podtrzymujący i wykryje, że połączenie nie działa.

W międzyczasie użyj -dopcji, aby odłączyć sesję ekranu od terminala, w którym się znajduje.

screen -r -d 30608

screen -rd jest prawie standardowym sposobem dołączania do istniejącej sesji ekranowej.

Gilles
źródło
15
Aby dołączyć do istniejącej sesji screen, to screen -x, screen -rdjest dołączenie do niego po jednej to z każdego terminala został dołączony do. W przypadku PO zgodziłbym się, że ten drugi jest prawdopodobnie preferowany, ale w ogólnym przypadku niekoniecznie. Zazwyczaj używam -xRdo dołączania lub tworzenia, jeśli nie ma nic do dołączenia.
Stéphane Chazelas,
10

Zgodnie z instrukcją można „wznowić” tylko odłączone ekrany:

[dopasowanie] ” „ [dopasowanie] ” Nie uruchamiaj ekranu, ale zamiast tego wydrukuj listę ciągów identyfikacyjnych sesji (zwykle w formie pid.tty.host; patrz Nazwa sesji). Sesje oznaczone jako „odłączone” można wznowić . Te oznaczone jako „podłączone” działają i mają terminal kontrolny. Jeśli sesja działa w trybie wielu użytkowników, jest oznaczona jako „wielu”. Sesje oznaczone jako „nieosiągalne” albo żyją na innym komputerze lub są martwe. Nieosiągalna sesja jest uważana za martwą, jeśli jej nazwa odpowiada nazwie lokalnego hosta lub podanemu parametrowi, jeśli taki istnieje. Zobacz-ls
-list
screen -r-rflaga dla opisu jak konstruować dopasowania. Sesje oznaczone jako „martwe” należy dokładnie sprawdzić i usunąć. Zapytaj administratora systemu, jeśli nie jesteś pewien. Usuń sesje z -wipeopcją „ ”.

To, czego chcesz, to ta opcja:

' -x'
Dołącz do sesji, która jest już dołączona gdzie indziej (tryb wielu wyświetlaczy). Ekran odmawia dołączenia od siebie. Ale podczas kaskadowania wielu ekranów pętle nie są wykrywane; dbać.

Thomas Dickey
źródło
4
Z -xsesji nadal będą dołączone „gdzieś”. Aby w pełni przejąć sesję, należy użyć opcji -d | -D (opcje odłączania) oraz opcji -r | -R (opcje ponownego podłączania).
Andrew Kozlov,
1
To alternatywa, ale może nie być tym, czego potrzebuje OP. Często dołączam z wielu lokalizacji.
Thomas Dickey,
4

Dołączam do ekranu z opcjami -rD

Z instrukcji:

-D -r
Reattach a session. If necessary detach and logout remotely first. 
Marsel Arduanov
źródło