Como listar as sessões de tela em execução?


233

Eu tenho vários servidores nos quais executo experimentos usando screen. O procedimento é o seguinte:

  1. ssh para o servidor XXX
  2. lançamento screen
  3. inicie experimentos em algumas guias
  4. destacar screen
  5. desconectar do servidor

Enquanto as experiências estão em execução, posso encontrar facilmente em quais servidores eles estão sshacessando todos os servidores e listando meus processos em execução (usando topou ps).

No entanto, depois que as experiências são concluídas, como posso encontrar em quais servidores tenho uma sessão de tela aberta (para que eu possa dar uma olhada na saída, relançá-la etc.)?

PS: meus experimentos também imprimem sua saída em arquivos ... mas esse não é o ponto da minha pergunta.

Respostas:


420

Para listar todas as sessões de tela de um usuário, execute o seguinte comando como esse usuário:

screen -ls

Para ver todas as sessões de tela em uma máquina específica, você pode:

ls -laR /var/run/screen/

Eu recebo isso na minha máquina:

gentle ~ # ls -laR /var/run/screen/

/var/run/screen/:
total 1
drwxrwxr-x  4 root utmp   96 Mar  1  2005 .
drwxr-xr-x 10 root root  840 Feb  1 03:10 ..
drwx------  2 josh users  88 Jan 13 11:33 S-josh
drwx------  2 root root   48 Feb 11 10:50 S-root

/var/run/screen/S-josh:
total 0
drwx------ 2 josh users 88 Jan 13 11:33 .
drwxrwxr-x 4 root utmp  96 Mar  1  2005 ..
prwx------ 1 josh users  0 Feb 11 10:41 12931.pts-0.gentle

/var/run/screen/S-root:
total 0
drwx------ 2 root root 48 Feb 11 10:50 .
drwxrwxr-x 4 root utmp 96 Mar  1  2005 ..

Este é um uso brilhantemente Unixy de soquetes Unix envolvidos em permissões de sistema de arquivos para lidar com segurança, estado e fluxos.


1
Pergunto-me por esta resposta, que respondeu a pergunta perfeitamente, tem um downvote ...
Blaszard

Como alternativa, se você deseja obter uma tela específica com base em uma convenção de nomenclatura, pode saudar o resultado. ls -R /var/run/screen/S-root/ | grep "NamingConvention". As telas são salvas no <pid>.<screen_name>formato. Isso é útil para scripts bash. Portanto, se você tiver uma tela com nome, 0000.NamingConventionela literalmente retornará o nome das telas que você procura em um formato fácil de analisar.
Elias Ranz


13

Embora a resposta de joshperry esteja correta, acho muito irritante que ele não diga o nome da tela (o que você definiu com a opção -t), que é realmente o que você usa para identificar uma sessão. (não é culpa dele, é claro, isso é falha de uma tela)

Por isso, em vez disso, uso um script como este: ps auxw|grep -i screen|grep -v grep


2
Dê uma olhada na opção -S. O valor fornecido é armazenado no nome do arquivo do soquete unix e é visível na lssaída. Se você precisar, também pode manter a opção -t.
Joshperry

A opção -S é ótima, pois também permite que você retome o nome da sessão:screen -rd <sessionname>
jorisw

7

Não tenho muita certeza da sua pergunta, mas se tudo o que você realmente deseja é uma sessão de tela aberta no momento, tente:

screen -ls

6
 For windows system

 Open putty 
 then login in server

Se você quiser ver a tela no console, precisará escrever o comando

 Screen -ls

se você precisar acessar a tela, use o comando abaixo

 screen -x screen id

Escreva PWDna linha de comando para verificar em qual pasta você está atualmente


3

Na maioria dos casos, um screen -RRx $username/será suficiente :)

Se você ainda deseja listar todas as telas, coloque o seguinte script no seu caminho e chame-o de tela ou o que quiser:

#!/bin/bash
if [[ "$1" != "-ls-all" ]]; then
    exec /usr/bin/screen "$@"
else
    shopt -s nullglob
    screens=(/var/run/screen/S-*/*)
    if (( ${#screens[@]} == 0 )); then
        echo "no screen session found in /var/run/screen"
    else
        echo "${screens[@]#*S-}"
    fi
fi

Ele se comportará exatamente como a tela, exceto para mostrar todas as sessões de tela, ao fornecer a opção -ls-all como primeiro parâmetro.


3

Várias pessoas já apontaram que

$ screen -ls

listaria as sessões de tela.

Aqui está outro truque que pode ser útil para você.

Se você adicionar o seguinte comando como uma última linha no seu arquivo .bashrc no servidor xxx, ele será reconectado automaticamente à sua sessão de tela no login.

screen -d -r

Espero que você ache útil.


1
Quero observar que você precisará fazer login como o mesmo usuário que iniciou a tela. Fiquei preocupado que minha sessão de tela tivesse terminado, mas minha cópia do arquivo continuava na seção "mídia" do usuário. Pode parecer lógico, mas pode salvar algum pânico se você o supervisionar.
Paul

0

ps x | grep SCREEN

para ver o que é essa tela em execução, caso você tenha usado o comando

tela -A -m -d php make_something.php


-4

Então você está usando a tela para manter as experiências em segundo plano, ou o quê? Se sim, por que não apenas iniciá-lo em segundo plano?

./experiment &

E se você está perguntando como receber a notificação do trabalho que fiz, que tal encadear o experimento com um comando mail?

./experiment && echo "the deed is done" | mail youruser@yourlocalworkstation -s "job on server $HOSTNAME is done"

Estou usando a tela para poder me desconectar dos servidores sem encerrar meus experimentos. A questão não era como obter notificações (embora o correio pudesse ser uma boa maneira de fazê-lo), mas como descobrir se uma determinada máquina tinha uma sessão de tela aberta. Obrigado mesmo assim pela sua resposta!
1111 Wookai

Não sou um administrador de sistemas experiente, mas acho que o uso da tela para executar os processos do servidor funciona bem: se algo der errado, basta clicar nessa janela e ver toda a saída que levou ao problema - você não precisa comece a abrir arquivos de log. Isso também significa que você pode facilmente matar um processo com ctrl + c. Tudo isso é útil se você estiver frequentemente iniciando e desligando o mesmo serviço.
amigos estão dizendo sobre steve
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.