Como anexar tela gnu sem saber o número tty

4

Depois de iniciar várias sessões de tela do gnu com

screen -S name1
screen -S name2

Gostaria de anexar seletivamente a eles. Se eu fizer

screen -D -R name1

não será anexado, mas sim impresso:

There are several suitable screens on:
    6799.name1        (08.02.2013 15:47:23)   (Detached)
    3661.name2        (08.02.2013 13:43:25)   (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

Funciona obviamente se eu digitar:

screen -D -R 6799.name1

Mas eu gostaria de anexar sem conhecer o número tty, porque eu quero começar as sessões de tela por um script que leva o nome como argumento. Não sabendo o número tty neste momento eu precisaria copiar à mão esse número sempre que eu quiser anexar mais tarde.

Uma solução óbvia seria extrair o número tty da saída de tela acima usando operações de string. Mas isso parece um pouco estranho. Existe uma maneira de dizer à tela para anexar a uma sessão nomeada específica, seja qual for o número tty?

Note que tentei as diferentes combinações de [-d|-D] [-r|-R] mencionadas nas man pages.

Nota adicionada:

Eu crio as sessões de tela separadas em um script usando ssh com

ssh -t ${host} "
    screen -S \"$exefile\" -t \"$exefile\" -R "nice -n$prio \"$exefile\" ${exeparams[@]}"; 
    exit 0";

Mais tarde, tento me conectar usando

ssh -t ${host} "
    screen -D -R -S \"$exefile\" && 
    echo \"finished.\"; 
    exit";

em que $exefile é o nome do executável e a sessão de tela à qual desejo me conectar.

    
por highsciguy 08.02.2013 / 16:10

3 respostas

0

A única solução confiável que encontrei foi o método de força bruta descrito na pergunta. Para se conectar a uma tela existente com o nome $exefile no controle remoto $host via ssh, ou para criar uma nova se ela não existir, pode-se usar (em um bash shell):

ssh -t $host "
    echo \"done.\" &&
    echo \"itentifying screen ...\" &&
    myscreen=\'screen -list | sed -n \"s/^\s*\s\([0-9]*\.$exefile\)\s\s*.*$/\1/p\"\' &&
    if [ "X\$myscreen" = "X" ]; then 
        echo \"no existing screen session found, creating new\"; 
        screen -S \"$exefile\"; 
    else 
        echo \"connecting to screen \$myscreen\"; 
        screen -d -r \"\$myscreen\"; 
    fi &&
    echo \"finished.\";
    exit";

A primeira execução criará uma nova sessão em $host . Se a tela estiver desanexada com Ctrl+a,d , o shell de login ssh será fechado. Se o mesmo comando for emitido novamente, ele será reconectado à tela existente. Várias sessões de tela com nomes diferentes $exefile são possíveis e podem ser reconectadas independentemente. A mágica é feita por sed , que procura a saída de screen -list para um nome que corresponda ao padrão [tty].name . Observe que o nome da tela pode precisar ser escapado se contiver% caracteres especiais emsed.

    
por 22.02.2013 / 14:06
4

Como eu sou o único que se conecta às minhas sessões de screen , e às vezes quero mais de um console conectado (a um modo de exibição múltipla) a uma sessão de cada vez, eu uso a opção -x

# screen -S hosts
# screen -ls
  There is a screen on:
      12828.hosts     (Detached)
  1 Socket in /var/run/screen/S-uther.
# screen -x hosts

De man 1 screen

   -x   Attach  to a not detached screen session. 
       (Multi display mode).Screen refuses to attach 
       from within itself.  But when cascading multiple 
       screens, loops are  not  detected; take care.
    
por 08.02.2013 / 16:33
2

Isso deve funcionar:

screen -S name1 -D -R
    
por 08.02.2013 / 16:26