Ponowne podłączanie do istniejącej sesji ekranowej

81

Mam program działający pod ekranem. W rzeczywistości, kiedy odłączam się od sesji i sprawdzam netstat, widzę, że program nadal działa (to jest to, czego chcę):

udp        0      0 127.0.0.1:1720          0.0.0.0:*                           3759/ruby       

Teraz chcę ponownie dołączyć do sesji z tym procesem. Więc uruchamiam nowy terminal i wpisuję screen -r

$ screen -r
There are several suitable screens on:
    5169.pts-2.teamviggy    (05/31/2013 09:30:28 PM)    (Detached)
    4872.pts-2.teamviggy    (05/31/2013 09:25:30 PM)    (Detached)
    4572.pts-2.teamviggy    (05/31/2013 09:07:17 PM)    (Detached)
    4073.pts-2.teamviggy    (05/31/2013 08:50:54 PM)    (Detached)
    3600.pts-2.teamviggy    (05/31/2013 08:40:14 PM)    (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

Ale skąd mam wiedzieć, która sesja uruchamia proces, który utworzyłem?

Teraz jeden z dokumentów, z którymi się spotkałem, powiedział:

„Gdy używasz okna, wpisz Ca A, aby nadać mu nazwę. Ta nazwa będzie używana na liście okien i pomoże ci zapamiętać, co robisz w każdym oknie, gdy zaczniesz używać wielu okien. „

Rzecz w tym, że kiedy jestem na nowej sesji ekranowej, próbuję nacisnąć control + A i nic się nie dzieje.

JohnMerlino
źródło
Szybkim sposobem na wybranie jednego z pomocą listy z wielu otwartych ekranach, jest screen -rnastępnie numer 1, 2, 3 ... w tym wykazie ekranów.
user18099

Odpowiedzi:

91

W grę wchodzą dwa poziomy „list”. Po pierwsze, masz „listę okien” w ramach pojedynczej sesji, do czego służy ctrl-A A, a po drugie - „listę sesji”, która jest tym, co wkleiłeś w swoim pytaniu i co można również wyświetlić screen -ls.

Możesz dostosować nazwy sesji za pomocą -Sparametru, w przeciwnym razie używa twojej nazwy hosta (teamviggy), na przykład:

$ screen

(Ctrl-A d, aby odłączyć)

$ screen -S myprogramrunningunderscreen

(Ctrl-A d, aby odłączyć)

$ screen -ls

There are screens on:
    4964.myprogramrunningunderscreen    (05/31/2013 09:42:29 PM)    (Detached)
    4874.pts-1.creeper  (05/31/2013 09:39:12 PM)    (Detached)
2 Sockets in /var/run/screen/S-paul.

Jako bonus możesz użyć jednoznacznego skrótu nazwy, którą przekazujesz -Spóźniej, aby połączyć się ponownie:

screen -r myprog

(Jestem ponownie połączony z myprogramrunningunderscreensesją)

Paweł
źródło
Czy ctrl + aa działa dla ciebie? Naciskam jednocześnie klawisze Control + a, a następnie szybko ponownie naciskam klawisz i nic się nie dzieje.
JohnMerlino
Tak; jest różnica między ctrl-A ai ctrl-A shift-A. Ten drugi skłonił mnie do tego Set window's title to:. Upewnij się, że naciskasz shift dla drugiego A.
Paul
Robię: „screen -r 21 tweet” i dostaję jako odpowiedź: „Jest ekran: 3239.21 tweet (08/21/2015 09:14:35 AM) (Załączony) Nie ma ekranu, który można wznowić pasujący do 21 tweet”. Co to może być?
Michael,
Bardzo nieoczywistym zastrzeżeniem dotyczącym nazewnictwa sesji ekranowych jest to, że jeśli je nazwiesz -S, musisz użyć co najmniej jednoznacznego skrótu nazwy po numerze identyfikacyjnym i kropki w pełnej nazwie sesji ekranowej podczas wznawiania, w przeciwieństwie do automatycznego wygenerowane nazwy sesji, w których możesz podać identyfikator i kropkę.
Spencer Williams
1
Literówka, naprawiona. I ta strona nie pozwoli mi opublikować tak krótkiego komentarza bez dodatkowego tekstu.
Paul
37

Miałem przypadek, w którym screen -rnie udało się ponownie podłączyć. Dodanie -dflagi, aby wyglądało to tak

screen -d -r

pracował dla mnie. Odłączył poprzedni ekran i pozwolił mi ponownie podłączyć. Zobacz stronę podręcznika, aby uzyskać więcej informacji.

njcwotx
źródło
12

Prostym sposobem jest ponowne podłączenie do dowolnego ekranu za pomocą

screen -r

Następnie, gdy uruchomisz ekran, możesz uzyskać listę wszystkich aktywnych ekranów, naciskając Ctrl-A "(np. Control-A, a następnie podwójny cytat). Następnie możesz po prostu wybrać aktywne ekrany pojedynczo i zobaczyć, jakie są uruchomione. Nazewnictwo ekranów oczywiście ułatwi identyfikację właściwego.

Tylko moje dwa centy

Dr K.
źródło
okie, jak nazwać mój ekran?
austin
@austin screen -S <nazwa_sesji>
Brian
4

Zwykle używam następującej kombinacji, w której muszę pracować na kilku komputerach w kilku klastrach:

screen -S clusterX

To tworzy nową sesję ekranową, w której mogę zbudować środowisko.

screen -dRR clusterX

Tego właśnie używam, aby ponownie dołączyć do tej sesji ekranowej. Sprytne bity są takie, że jeśli sesja jest dołączona gdzie indziej, odłącza ten inny ekran. Co więcej, jeśli z jakiegoś dziwnego powodu nie ma sesji, na przykład ktoś ponownie uruchomił mój serwer bez mojej wiedzy, tworzy ją. Wreszcie. jeśli istnieje wiele sesji, wykorzystuje pierwszą.

Ogromne uznanie dla https://support.dvsus.com/hc/en-us/articles/212925186-Linux-GNU-Screen- instrukcje dla tej wskazówki jakiś czas temu.

EDYTOWAĆ:

Oto kilka przydatnych wyjaśnień man screendotyczących tajemniczych parametrów

       -d -r   Reattach a session and if necessary detach it first.

       -d -R   Reattach a session and if necessary detach or  even  create  it
               first.

       -d -RR  Reattach  a  session  and if necessary detach or create it. Use
               the first session if more than one session is available.

       -D -r   Reattach a session. If necessary  detach  and  logout  remotely
               first.

jest więcej, -Dwięc koniecznie sprawdźman screen

Lefty G. Balogh
źródło
2

Dane wyjściowe screen -listsą sformatowane jak pid.tty.host. Pids można wykorzystać do uzyskania pierwszego procesu potomnego z pstree:

screen -list|cut -f1 -d'.'|cut -f2|xargs -n 1 pstree -p|grep "^screen"

Otrzymasz taką listę

screen(5169)---zsh(5170)---less(15268)
screen(4872)---zsh(4873)-+-cat(11364)
...
tilnam
źródło
1
screen -d -r 4964

lub

screen -d -r 4874

$ screen -ls
There are screens on:
4964.myprogramrunningunderscreen    (05/31/2013 09:42:29 PM)    (Detached)
4874.pts-1.creeper  (05/31/2013 09:39:12 PM)    (Detached)
2 Sockets in /var/run/screen/S-paul.
Vlad Kogan
źródło