mata uma tela (mas não todas as telas)

18

Eu tenho várias telas em execução em um servidor Ubuntu que são iniciadas como:

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

E eu preciso matar uma tela, mas não todas. Qual é o comando correto para matar uma única tela em particular com o seu nome? Eu li através do man pages mas não consigo encontrar o comando que estou procurando.

Eu também quero escrever este comando em um script bash para que eu não possa simplesmente screen -r screen1 então pressionar Ctrl + X como Eu normalmente faria.

    
por BassKozz 21.12.2009 / 19:45

6 respostas

19

Da página do 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.

Você pode fazer:

        screen -X -S <sessionid> kill
    
por 21.12.2009 / 19:56
9

Se você fizer um screen -list , perceberá que cada nome de tela começa com um número, que é o PID da tela:

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

De lá, basta enviar um sinal KILL para este PID específico:

$ kill 12281

e isso matará a tela específica.

    
por 21.12.2009 / 19:54
1

A solução de defraagh não funciona para mim, no entanto, posso matar a sessão de tela usando a ideia da Raphink:

screen -list obtenha o ID do processo

kill -9 PROCESSID

tela

- limpe SESSIONID

    
por 29.09.2010 / 21:26
1

Se você tem várias telas com o mesmo nome, pode matá-las de uma só vez:

screen -ls  | egrep "^\s*[0-9]+.ScreenName" | awk -F "." '{print $1}' | xargs kill
  • O comando screen -ls imprime telas com seu número de processo. Por exemplo, 4773.test é uma tela com o número de processo 4773 e o nome test . Exemplo de saída:

    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)
    
  • Comandos egrep filtram o texto de exemplo acima enviado por meio da linha canalizada | .

  • O comando awk -F "." '{print $1}' extrai a primeira coluna de cada linha. Delimitador entre colunas é definido como ponto (.) pela opção -F
  • Finalmente o comando xargs kill irá matar todo o processo cujos números são enviados via pipe |. xargs é usado quando queremos executar um comando em cada uma das entradas.
por 23.05.2018 / 13:11
0

Você abre uma nova janela com

Ctrl A + C

Você fecha uma janela com

Ctrl + D

ou comando de saída dentro da janela

    
por 23.05.2017 / 17:09
0

Eu tenho lidado com isso da seguinte forma:

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

A explicação é que você pega a saída de screen -ls e encontra a tela em particular que está interessado usando grep e então atribui aquela string à variável process .

Como a saída de screen -ls é sempre o PID seguido por um período, você pode usar o corte para se livrar do período e depois de tudo. no exemplo acima, colocamos isso entre parênteses e o alimentamos para o comando kill, embora você possa fazê-lo linearmente, o que pode incluir a gravação em um arquivo temporário e a leitura dele.

Você precisa ter certeza de que seu nome de tela é único e que grep está SOMENTE retornando o nome da tela que você quer matar.

    
por 25.02.2015 / 02:39