Anexando novamente a uma sessão de tela existente


82

Eu tenho um programa em execução na tela. De fato, quando eu desanexo da sessão e verifico netstat, posso ver que o programa ainda está em execução (que é o que eu quero):

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

Agora, quero anexar novamente à sessão que está executando esse processo. Então eu inicio um novo terminal e digito 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.

Mas como sei qual é a sessão que está executando o processo que criei?

Agora, um dos documentos que encontrei disse:

"Quando você estiver usando uma janela, digite Ca A para dar um nome. Esse nome será usado na lista de janelas e ajudará você a lembrar o que está fazendo em cada janela quando começar a usar muitas janelas. "

O problema é que, quando estou em uma nova sessão de tela, tento pressionar control + a A e nada acontece.


Uma maneira rápida de selecionar uma de uma lista de várias telas abertas é screen -rseguida por um número 1, 2, 3 ... nessa lista de telas.
user18099

Respostas:


92

Existem dois níveis de "listagens" envolvidos aqui. Primeiro, você tem a "lista de janelas" em uma sessão individual, e é para isso que serve o ctrl-A A; depois, há uma "lista de sessões", que você colou na sua pergunta e com o que também pode ser visualizado screen -ls.

Você pode personalizar os nomes da sessão com o -Sparâmetro, caso contrário, ele usa seu nome de host (teamviggy), por exemplo:

$ screen

(ctrl-A d para desanexar)

$ screen -S myprogramrunningunderscreen

(ctrl-A d para desanexar)

$ 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.

Como bônus, você pode usar uma abreviação inequívoca do nome para o qual você passa -Smais tarde para se reconectar:

screen -r myprog

(Estou reconectado à myprogramrunningunderscreensessão)


Que ctrl + aa funciona para você? Pressiono control + a ao mesmo tempo e rapidamente pressiono a novamente e nada acontece.
31413 JohnMerlino

Sim; há uma diferença entre ctrl-A ae ctrl-A shift-A. O último me levou a Set window's title to:. Certifique-se de pressionar Shift para o segundo A. #
Paul

Eu faço: "screen -r 21tweet" e recebo como resposta: "Existe uma tela em: 3239.21tweet (21/08/2015 09:14:35 AM) (em anexo) Não há uma tela a ser retomada correspondente a 21tweet." O que poderia ser isso?
Michael

Uma ressalva não muito óbvia das sessões de tela de nomenclatura é que, se você as nomear -S, precisará usar pelo menos uma abreviação inequívoca do nome após o número de identificação e o ponto no nome completo da sessão de tela ao reiniciar, ao contrário do modo automático. nomes de sessão gerados, onde você pode incluir o ID e o ponto.
Spencer Williams

1
Erro de digitação, fixo. E este site não permitirá que eu poste um comentário tão curto sem texto adicional.
Paul

37

Eu tive um caso em que screen -rnão foi possível reconectar. Adicionando a -dbandeira para ficar assim

screen -d -r

trabalhou para mim. Destacou a tela anterior e me permitiu recolocar. Veja a página do manual para mais informações.


12

Uma maneira fácil é simplesmente reconectar-se a uma tela arbitrária com

screen -r

Então, quando você estiver executando a tela, poderá obter uma lista de todas as telas ativas pressionando Ctrl-A "(ou seja, controle-A seguido de aspas duplas). Depois, basta selecionar as telas ativas uma de cada vez e ver o que elas estão executando. A nomeação das telas facilitará, é claro, a identificação da tela certa.

Apenas meus dois centavos


okie, como eu nomeio minha tela?
Austin

@austin screen -S <sessionname>
Brian

4

Costumo usar a seguinte combinação em que preciso trabalhar em várias máquinas em vários clusters:

screen -S clusterX

Isso cria a nova sessão de tela onde eu posso construir o ambiente.

screen -dRR clusterX

É isso que eu uso posteriormente para reconectar a essa sessão de tela. Os bits bacanas são que, se a sessão estiver anexada em outro lugar, ela desanexa essa outra exibição. Além disso, se não houver sessão por algum motivo peculiar, como se alguém reiniciasse meu servidor sem que eu soubesse, ele criaria uma. Finalmente. se existirem várias sessões, ele usará a primeira.

Muitos elogios para https://support.dvsus.com/hc/en-us/articles/212925186-Linux-GNU-Screen-instructions para esta dica há algum tempo.

EDITAR:

Também aqui estão algumas explicações úteis man screensobre parâmetros enigmáticos

       -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.

há mais com -Disso, não deixe de conferirman screen


2

A saída de screen -listé formatada como pid.tty.host. Os pids podem ser usados ​​para obter o primeiro processo filho com pstree:

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

Você receberá uma lista como esta

screen(5169)---zsh(5170)---less(15268)
screen(4872)---zsh(4873)-+-cat(11364)
...

1
screen -d -r 4964

ou

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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.