matar una pantalla (pero no todas las pantallas)


19

Tengo varias pantallas ejecutándose en un servidor Ubuntu que se inician como:

screen -dmS screen1 cmd
screen -dmS screen2 cmd
etc...

Y necesito matar una pantalla, pero no todas. ¿Cuál es el comando correcto para matar una sola pantalla en particular con su nombre? He leído las páginas del manual, pero parece que no puedo encontrar el comando que estoy buscando.

También quiero escribir este comando en un script bash para no poder simplemente screen -r screen1presionar Ctrl+ Xcomo lo haría normalmente.


Lo siento, pensé que se trataba de Donkey Kong por un segundo
Chopper3


Esa es una buena camiseta, la mayoría de la gente no la entenderá, a menos que hayan visto "The King of Kong": imdb.com/title/tt0923752
BassKozz

La palabra correcta para un objeto de una frase es "te".
Pausado hasta nuevo aviso.

3
Dijiste "tómalo tú" aquí y "Gracias" a continuación. Debe ser "tómalo [para] ti" y "Gracias [sé para] ti".
Pausado hasta nuevo aviso.

Respuestas:


19

Desde la página del manual:

   -X   Send the specified command to a running screen  session.  You  can
        use  the  -d or -r option to tell screen to look only for attached
        or detached screen sessions. Note that this command  doesn't  work
        if the session is password protected.

Tu puedes hacer :

        screen -X -S <sessionid> kill

¡¡¡PERFECTO!!! Gracias defraagh, musta se lo perdió en el hombre.
BassKozz

Es bueno saberlo :-)
phaphink

9

Si lo hace screen -list, notará que cada nombre de pantalla comienza con un número, que es el PID de la pantalla:

 $ screen -list
There are screens on:
        12281.pts-1.jonah       (12/21/2009 07:53:19 PM)        (Attached)
        10455.pts-1.jonah       (12/19/2009 10:55:25 AM)        (Detached)
2 Sockets in /var/run/screen/S-raphink.

A partir de ahí, solo envíe una señal KILL a este PID específico:

$ kill 12281

y matará la pantalla específica.


esto no funcionará porque lo estoy ejecutando desde un script bash, y prefiero no tener que extraer el PID de la lista de la pantalla que coincide con la pantalla correcta ... la respuesta anterior de defraagh funcionó de maravilla. Gracias
BassKozz

Ok, bueno que defraagh tenía una solución perfecta para eso.
phaphink

1

La solución de defraagh no funciona para mí, sin embargo, puedo matar la sesión de pantalla usando la idea de Raphink:

screen -list obtiene el ID del proceso

kill -9 PROCESSID

SESSIONID de barrido de pantalla


1

Si tiene varias pantallas con el mismo nombre, puede matarlas a la vez:

screen -ls  | egrep "^\s*[0-9]+.ScreenName" | awk -F "." '{print $1}' | xargs kill
  • El comando screen -lsimprime pantallas con su número de proceso. Por ejemplo, 4773.test es una pantalla con el número de proceso 4773 y la prueba de nombre . Salida de muestra:

    6322.ss      (05/23/2018 10:39:08 AM)        (Detached)
    6305.sc  (05/23/2018 10:38:40 AM)        (Detached)
    6265.ScreenName       (05/23/2018 10:37:59 AM)        (Detached)
    6249.ScreenName  (05/23/2018 10:37:50 AM)        (Detached)
    6236.scc        (05/23/2018 10:37:42 AM)        (Detached)
  • El comando egrepfiltra por encima del texto de muestra enviado a través de una línea canalizada | .

  • El comando awk -F "." '{print $1}'extrae la primera columna de cada línea. El delimitador entre columnas se define como punto (.) Mediante la opción -F
  • Finalmente, el comando xargs killmatará todos los procesos cuyos números se envíen por tubería |. xargsse usa cuando queremos ejecutar un comando en cada una de las entradas.

0

Abre una nueva ventana con

Ctrl A + C

Cierras una ventana con

Ctrl + D

o salir del comando dentro de la ventana


0

He estado tratando con esto de la siguiente manera:

process=$(screen -ls | grep screen1)
kill $(echo $process | cut -f1 -d'.')
exit

La explicación es que toma la salida screen -lsy encuentra la pantalla particular que le interesa mediante grep y luego asigna esa cadena a la variable process.

Dado que la salida de screen -lssiempre es el PID seguido de un período, puede usar cortar para deshacerse del período y todo lo que sigue. en el ejemplo anterior, lo ponemos entre paréntesis y lo alimentamos al comando kill, aunque podría hacerlo de forma lineal, lo que podría incluir escribir en un archivo temporal y leerlo.

Debe asegurarse de que su nombre de pantalla sea único y que grep SOLO le devuelva el nombre de la pantalla que desea eliminar.

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.