¿Cómo enumerar las sesiones de pantalla en ejecución?

233

Tengo un montón de servidores, en los que ejecuto experimentos usando screen. El procedimiento es el siguiente:

  1. ssh al servidor XXX
  2. lanzamiento screen
  3. iniciar experimentos en unas pocas pestañas
  4. despegar screen
  5. desconectarse del servidor

Mientras se ejecutan los experimentos, puedo encontrar fácilmente en qué servidores están sshyendo a todos los servidores y enumerando mis procesos en ejecución (usando topo ps).

Sin embargo, una vez que los experimentos hayan finalizado, ¿cómo podría encontrar en qué servidores tengo abierta una sesión de pantalla (para poder ver el resultado, reiniciarlos, etc.)?

PD: mis experimentos también imprimen su salida a archivos ... pero este no es el punto de mi pregunta.

Wookai
fuente

Respuestas:

420

Para enumerar todas las sesiones de pantalla para un usuario, ejecute el siguiente comando como ese usuario:

screen -ls

Para ver todas las sesiones de pantalla en una máquina específica, puede hacer:

ls -laR /var/run/screen/

Me sale esto en mi 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 es un uso bastante brillante de Unixy de Soix Unix envuelto en permisos del sistema de archivos para manejar la seguridad, el estado y las transmisiones.

joshperry
fuente
1
Me pregunto por qué esta respuesta, una que respondió la pregunta perfectamente, recibió un
voto negativo
Alternativamente, si desea obtener una pantalla específica basada en una convención de nomenclatura, puede obtener el resultado. ls -R /var/run/screen/S-root/ | grep "NamingConvention". Las pantallas se guardan en el <pid>.<screen_name>formato. Esto es útil para los scripts de bash. Entonces, si tiene una pantalla con nombre 0000.NamingConvention, literalmente devolverá el nombre de las pantallas que está buscando en un formato fácil de analizar.
Elias Ranz
19

El comando screen -list puede ser lo que quieres.

Ver al hombre

Zoredache
fuente
13

Si bien la respuesta de joshperry es correcta, me parece muy molesto que no le diga el nombre de usuario (el que configuró con la opción -t), eso es realmente lo que usa para identificar una sesión. (no es su culpa, por supuesto, eso es un defecto de la pantalla)

Es por eso que en su lugar uso un script como este: ps auxw|grep -i screen|grep -v grep

o0 '.
fuente
2
Echa un vistazo a la opción -S. El valor proporcionado se almacena en el nombre de archivo del socket Unix y es visible en la lssalida. Si lo necesita, puede mantener la opción -t también.
joshperry
La opción -S es excelente, ya que también le permite reanudar por ese nombre de sesión:screen -rd <sessionname>
jorisw
7

No estoy realmente seguro de su pregunta, pero si todo lo que realmente quiere es una lista de la sesión de pantalla abierta actualmente, intente:

screen -ls
skinp
fuente
6
 For windows system

 Open putty 
 then login in server

Si desea ver la pantalla en la consola, debe escribir el comando

 Screen -ls

si tiene que acceder a la pantalla, debe usar el siguiente comando

 screen -x screen id

Escriba PWDen la línea de comando para verificar en qué carpeta se encuentra actualmente

Ankit jain
fuente
3

En la mayoría de los casos, un screen -RRx $username/testamento será suficiente :)

Si todavía desea enumerar todas las pantallas, coloque el siguiente script en su ruta y llámelo pantalla o lo que quiera:

#!/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

Se comportará exactamente como la pantalla, excepto para mostrar todas las sesiones de pantalla, cuando se da la opción -ls-all como primer parámetro.

ObiWahn
fuente
3

Múltiples personas ya han señalado que

$ screen -ls

enumeraría las sesiones de pantalla.

Aquí hay otro truco que puede ser útil para usted.

Si agrega el siguiente comando como última línea en su archivo .bashrc en el servidor xxx, se volverá a conectar automáticamente a su sesión de pantalla al iniciar sesión.

screen -d -r

Esperamos que te sea útil.

samurai
fuente
1
Quiero tener en cuenta que tendrá que iniciar sesión como el mismo usuario que inició la pantalla, me preocupaba que mi sesión de pantalla desapareciera, pero mi copia de archivo continuaba bajo los "medios" del usuario. Puede sonar lógico, pero podría ahorrar algo de pánico si lo supervisas.
Paul
0

ps x | grep PANTALLA

para ver qué pantalla se está ejecutando en caso de que haya usado el comando

pantalla -A -m -d php make_something.php

el mundodecoded
fuente
-4

Entonces, ¿estás usando la pantalla para mantener los experimentos ejecutándose en segundo plano, o qué? Si es así, ¿por qué no comenzarlo en segundo plano?

./experiment &

Y si está preguntando cómo obtener una notificación del trabajo que hice, ¿qué le parece unir el experimento con un comando de correo?

./experiment && echo "the deed is done" | mail youruser@yourlocalworkstation -s "job on server $HOSTNAME is done"
JosefAssad
fuente
Estoy usando la pantalla para poder desconectarme de los servidores sin terminar mis experimentos. La pregunta no era cómo obtener notificaciones (aunque el correo podría ser una buena forma de hacerlo), sino cómo averiguar si una máquina determinada tenía una sesión de pantalla abierta. Gracias de todos modos por tu respuesta!
Wookai
No soy un administrador de sistemas con experiencia, pero creo que usar la pantalla para ejecutar procesos del servidor funciona bien: si algo sale mal, puede pasar a esa ventana y ver toda la salida que condujo al problema; no es necesario que comenzar a abrir archivos de registro. También significa que puede matar fácilmente un proceso con ctrl + c. Todo esto es útil si con frecuencia inicia y cierra el mismo servicio.
Steve Bennett