Nie można przywrócić odłączonego ekranu

11

Używam szpachli i mam niewiarygodne połączenie bezprzewodowe, więc używam ekranu, aby kontynuować pracę. Często jestem rozłączany, a potem nie mogę ponownie podłączyć ekranu. Pobiegnę screen -D -RRi będzie tam siedzieć bez końca. Próbowałem ctrl+zodzyskać konsolę, ps aux | grep screenpotem kill -9wszystkie wyniki, a potem screen -D -RRznowu, ale otrzymuję te same wyniki. Próbuję dowolną kombinację d i r, o których chcesz wspomnieć, ale nadal tam jest. Mój ekran już tam jest, po prostu nic nie zrobi, a przynajmniej nie zostanie wznowiony.

Czy ktoś ma jakieś wskazówki, porady lub pomysły na wznowienie sesji ekranowej?

Dave Aaron Smith
źródło

Odpowiedzi:

16

Widziałem to, kiedy połączyłem połączenie z aktywnym ekranem, a następnie ponownie nawiązałem połączenie. Błąd # 27462 („Połącz ponownie przeciąga się po utracie oryginalnej sesji”) opisuje problem tak, jak go widzę. Wygląda na to, że ekran próbuje powiadomić tty, które go trzymają, że ma zamiar odejść, ale ponieważ tty jest zawieszony z powodu zerwanego połączenia, musi poczekać na przekroczenie limitu czasu (czyli ponad pięć minut w niektórych przypadkach).

Aby to naprawić, robię to:

  • dowiedzieć się, który tty trzyma się sesji ekranowej ps -ef | grep screen | grep pty
  • znajdź bash logowania powiązany z tym tty ps -ef | grep bash | grep $PTY
  • zabij to uderzenie kill -KILL $PID

Powoduje to, że screen poprawnie kończy rozłączanie i pozwala na normalne ponowne połączenie.

Zobacz tutaj przykładowy skrypt, który nieco to automatyzuje.

David Mackintosh
źródło
ps -ef | ekran grep | grep tty nigdy niczego nie drukuje, ponieważ ps -ef | grep screen nigdy nie zwraca niczego z ciągiem tty.
Dave Aaron Smith
W rzeczywistości przykładowy skrypt wydaje się załatwić sprawę. Dzięki!
Dave Aaron Smith
1
Tak, miałem na myśli „pty”, a nie „tty”.
David Mackintosh
2

Miałem podobny problem z sesjami ekranowymi. Nazywam je i konfiguruję jako sesje dla wielu użytkowników. Odkryłem, że wyświetlał listę moich sesji, ale powiedział mi, że nie mam z kim się ponownie łączyć. Potem spróbowałem:

screen -x <session_name>

Działa jak mistrz!

Doug Noel
źródło
1

Nie mogę powiedzieć, że kiedykolwiek miałem problem z tym, że ekran nie wraca, bez względu na to, jakiego rodzaju połączenia używam. Moja zwykła metoda:

ssh myname@foo
screen -S sessionName
(do my work... get disconnected...)

ssh myname@foo
screen -d (just to make sure anything wasn't left attached)
screen -r sessionName
Jason Antman
źródło
1
Na przykład screen -list zwraca wartość 32322.mySession (Attached). Następnie przeglądam -d mySession. Następnie screen -list nadal zwraca 32322.mySession (Attached), a screen -r mySession zwraca Brak ekranu do wznowienia pasującego do daveSession.
Dave Aaron Smith
próbowałeś po prostu „screen -d”?
Jason Antman,
0

Czy to możliwe, że ten błąd dotyczy Ciebie?

http://savannah.gnu.org/bugs/?27462

Czy możesz spróbować wykonać obejście, które zalecają i sprawdzić, czy to działa?

Kyle-tummy.com
źródło
To obejście nie miało dla mnie większego sensu. Moje wyjście ps -ef | grep screen w ogóle nie wygląda jak przykład.
Dave Aaron Smith
0

Soulrce: https://kb.iu.edu/data/ahrm.html

To see your existing screen sessions, enter:
  screen -list
This will display a list of your current screen sessions. For instance, if you had one attached screen, you would see:

         1636.pts-21.hostname      (Attached)

To detach an attached screen, enter:
  screen -D
If you have more than one attached screen, you can specify a particular screen to detach. For example, to detach the screen in the above example, you would enter:
  screen -D 1636.pts-21.hostname
giorgio79
źródło
0

Jeśli jesteś mądry jak ja, próbujesz wznowić sesję ekranową rozpoczętą jak rootw przypadku zwykłego konta użytkownika. Odkryłem to, ls /var/run/screenpokazując mi katalog dlaroot

uhFocuz
źródło
0

Czasami mam ten sam problem (screen -r -d nie wznawia się, nie reaguje). Aby to naprawić, znajdź terminal (tty / pty) powiązany z sesją ekranu:

screen -list
There is a screen on:
    28176.pts-51.localhost        (Attached)
1 Socket in /tmp/uscreens/S-xxxx.

Znajdź wymieniony terminal (w tym przykładzie pts-51):

ps axuw | grep 'pts/51'   # will vary depending upon how pty's are named
you     12293  0.0  0.2  2148 1128 pts/51   Ss   10:34   0:00 -bash

Zabij procesy na tym terminalu (zwykle w swojej powłoce):

kill 12293

uruchom ps ponownie, aby upewnić się, że go nie ma. Jeśli nie :

kill -9 12293

Na moim serwerze (gnu / linux) czasami będę musiał zabić -9 kilka razy, aż do śmierci.

Po zakończeniu wszystkich procesów na tym terminalu ekran powinien zostać wznowiony poprawnie:

screen -r -d
tb303
źródło
-1

Usuń martwe ekrany za pomocą screen -wipe.

Gerçek Karakuş
źródło
Myślę, że to jest dokładnie odwrotność tego, co on próbuje zrobić.
Chris S