Volver a asociar a una sesión de pantalla existente


82

Tengo un programa corriendo bajo la pantalla. De hecho, cuando me desconecto de la sesión y compruebo netstat, puedo ver que el programa todavía se está ejecutando (que es lo que quiero):

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

Ahora quiero volver a adjuntar a la sesión que ejecuta ese proceso. Así que inicio una nueva terminal y escribo 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.

Pero, ¿cómo sé cuál es la sesión que ejecuta el proceso que creé?

Ahora uno de los documentos que encontré decía:

"Cuando use una ventana, escriba Ca A para asignarle un nombre. Este nombre se usará en la lista de ventanas y le ayudará a recordar lo que está haciendo en cada ventana cuando comience a usar muchas ventanas". "

El problema es que cuando estoy en una nueva sesión de pantalla, trato de presionar control + a A y no pasa nada.


Una forma rápida de seleccionar uno de una lista de múltiples pantallas abiertas, es screen -rseguido por un número 1, 2, 3 ... en esa lista de pantallas.
user18099

Respuestas:


92

Hay dos niveles de "listados" involucrados aquí. Primero, tiene el "listado de ventana" dentro de una sesión individual, que es para lo que sirve ctrl-A A, y segundo hay un "listado de sesión" que es lo que ha pegado en su pregunta y con lo que también se puede ver screen -ls.

Puede personalizar los nombres de sesión con el -Sparámetro; de lo contrario, utiliza su nombre de host (teamviggy), por ejemplo:

$ screen

(Ctrl-A d para separar)

$ screen -S myprogramrunningunderscreen

(Ctrl-A d para separar)

$ 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 beneficio adicional, puede usar una abreviatura inequívoca del nombre que le pasa -Smás tarde para volver a conectar:

screen -r myprog

(Estoy reconectado a la myprogramrunningunderscreensesión)


Que ctrl + aa te funciona? Presiono control + a al mismo tiempo y luego presiono rápidamente otra vez y no sucede nada.
JohnMerlino

Si; Hay una diferencia entre ctrl-A ay ctrl-A shift-A. Este último me incitó Set window's title to:. Asegúrese de presionar shift para la segunda A.
Paul

Lo hago: "screen -r 21tweet" y obtengo como respuesta: "Hay una pantalla encendida: 3239.21tweet (21/08/2015 09:14:35 AM) (Adjunto) No hay pantalla que se reanude que coincida con 21tweet". ¿Qué podría ser esto?
Michael

Una advertencia muy obvia con las sesiones de nombres de pantalla es que si los nombra -S, debe usar al menos una abreviatura inequívoca del nombre después del número de identificación y el punto en el nombre completo de la sesión de pantalla al reanudar, a diferencia de nombres de sesión generados, donde puede incluir la ID y el punto.
Spencer Williams

1
Error tipográfico, corregido. Y este sitio no me permitirá publicar un comentario tan corto sin texto adicional.
Paul

37

Tuve un caso donde screen -rno se pudo volver a conectar. Agregar la -dbandera para que se vea así

screen -d -r

trabajó para mi. Separó la pantalla anterior y me permitió volver a conectar. Vea la página del manual para más información.


12

Una manera fácil es simplemente reconectarse a una pantalla arbitraria con

screen -r

Luego, una vez que esté ejecutando la pantalla, puede obtener una lista de todas las pantallas activas presionando Ctrl-A "(es decir, control-A seguido de una comilla doble). Luego, puede seleccionar las pantallas activas de una en una y ver qué se están ejecutando. Nombrar las pantallas, por supuesto, facilitará la identificación de la correcta.

Solo mis dos centavos


ok, ¿cómo llamo a mi pantalla?
austin

@austin screen -S <sessionname>
Brian

4

Tiendo a usar el siguiente combo donde necesito trabajar en varias máquinas en varios grupos:

screen -S clusterX

Esto crea la nueva sesión de pantalla donde puedo construir el entorno.

screen -dRR clusterX

Esto es lo que uso posteriormente para volver a conectar a esa sesión de pantalla. Los bits ingeniosos son que si la sesión se adjunta en otro lugar, separa esa otra pantalla. Además, si no hay sesión por alguna razón peculiar, como si alguien reiniciara mi servidor sin que yo lo supiera, se crea una. Finalmente. si existen varias sesiones, usa la primera.

Muchas felicitaciones a https://support.dvsus.com/hc/en-us/articles/212925186-Linux-GNU-Screen-instructions por este consejo hace un tiempo.

EDITAR:

También aquí hay algunas explicaciones útiles de los man screenparámetros crípticos.

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

hay más, -Dasí que asegúrese de verificarman screen


2

La salida de screen -listestá formateada como pid.tty.host. Los pids se pueden usar para obtener el primer proceso secundario con pstree:

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

Obtendrás una lista como esta

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

1
screen -d -r 4964

o

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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.