Nie można ponownie dołączyć do sesji ekranowej po zerwaniu połączenia SSH

16

Wcześniej ponownie przyłączyłem się do długotrwałej sesji ekranowej z screen -dr control. Czasami jednak to polecenie nie łączy się ponownie z ekranem i zamiast tego zawiesza się na zawsze (ponad 10 minut, po których przerwałam). Dzieje się tak tylko wtedy, gdy połączenie SSH zostaje nieoczekiwanie zerwane, a nie przy odpowiednim odłączeniu ekranu Ctrl-A d. Inne przełączniki, takie jak screen -xlub screen -D -RRteż nie działają.

Ten post sugeruje zabicie PTY, która przechowuje sesję screen, co spowoduje, że screen zakończy swoje rozłączanie. Jednak po prostu zabija powłokę, z której screen -dr controlzostała wywołana.

Na przykład:

$ ps -ef | grep control | grep -v grep
nomad     7387  7109  0 13:05 pts/50   00:00:00 screen -dr control
nomad    15299     1  0 Nov27 ?        00:13:47 SCREEN -S control

$ ps -ef | grep bash | grep 'pts/50'
nomad     7109  7108  0 12:49 pts/50   00:00:00 -bash

Połączony post sugeruje zabicie bashprocesu za pomocą PID 7109. Spowoduje to również zabicie screen -dr controlprocesu za pomocą PID 7387. Potem nadal nie mogę połączyć się z ekranem.

Proces, SCREEN -S controlktóry rozpoczął sesję ekranową, ma initza swój element nadrzędny, którego oczywiście nie mogę zabić.

Czy istnieje sposób ponownego przyłączenia się do sesji ekranu zawieszonego?

Aktualizacja: Dzieje się tak w CentOS 6.4 przy użyciu jądra 2.6.32-358.6.1.el6.x86_64. Wszystkie powłoki są wydane w wersji bash 4.1.2 (1).

Viktor Rosenfeld
źródło
3
Co screen -lsmówi w tych „wiszących” przypadkach? screen -d -r <session>oznacza „odłącz i odzyskaj”, więc nie odłączenie go z pierwszej ręki nie powinno mieć znaczenia. (A za robienie tego często, nie robi ...)
mveroone
Spróbuj uruchomić lsof na procesach ekranowych, sprawdź, czy coś się nie utknęło. Screen używa gniazda unix do komunikacji między procesami, prawdopodobnie coś go utrzymało. Upewnij się także, że gniazdo nie zostało usunięte, nie zmieniono jego własności lub coś takiego. Zasadniczo powinieneś również uwzględnić używany system operacyjny i wersję, chociaż nie mam na myśli niczego szczególnego, co tym razem byłoby zależne od systemu operacyjnego.
Dan Pritts,
3
Czy używasz ssh'ing przez inny przeskok, np. Używasz netcata jako polecenia proxy? W tym przypadku miałem problem polegający na tym, że połączenie ssh z pierwszym polem spada, ale polecenie proxy netcat utrzymuje otwarte połączenie „drugie” ssh. -d powinien jednak działać.
Jens Timmerman,
Jens, twoja rada załatwiła sprawę. Rzeczywiście zrobiłem proxy przez netcat, a zabicie go na hoście pośrednim umożliwiło mi ponowne podłączenie do ekranu.
Viktor Rosenfeld,
Dlaczego chcesz zabić proces macierzysty polecenia zawieszonego ekranu? Chcesz zabić samą komendę dołączania ekranu. # 7387 w twoim przypadku.
Matthias Urlichs

Odpowiedzi:

6

Myślę, że powinieneś spróbować

screen -DR 

następnym razem - wściekłe (wielkie litery) wywołanie powinno zmusić go do rozłączenia innej sesji utrzymywanej przez pośredni skok netcat.

pacyfista
źródło
Próbowałem tego, to nie działa. Zabicie proxy Netcat załatwia sprawę.
Viktor Rosenfeld
Dziwne. Powinno. Co zamiast tego się dzieje?
Matthias Urlichs
Wszystkie dalsze wywołania screen (-dr, -x, -DR) zawieszają się na zawsze. Po zabiciu proxy Netcat te wywołania znów działają.
Viktor Rosenfeld
1

Jak zasugerował Jens Timmerman, ostatecznym powodem tego dziwnego zachowania było to, że łączyłem się ze zdalnym serwerem za pomocą SSH ProxyCommand i ncat. Po zabiciu ncatna maszynie pośredniej jestem w stanie ponownie dołączyć do sesji ekranowej.

Viktor Rosenfeld
źródło
-2

Jeśli jest to częsty problem, możesz również rozważyć użycie mosh jako zamiennika ssh:

http://mosh.mit.edu

Fred Concklin
źródło