mata uma tela (mas nem todas as telas)

19

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 preciso matar uma tela, mas não todas. Qual é o comando correto para matar uma única tela específica com seu nome? Eu li as páginas de manual, mas não consigo encontrar o comando que estou procurando.

Também quero escrever esse comando em um script bash, para que eu não possa simplesmente screen -r screen1pressionar Ctrl+ Xcomo faria normalmente.

BassKozz
fonte
Desculpe, pensei que isso fosse sobre Donkey Kong por um segundo #
Chopper3
Eu amo essa camiseta ohgizmo.com/wp-content/uploads/2008/11/…
Chopper3
Isso é um T agradável, a maioria das pessoas não vai conseguir tu, a menos que já vi "The King of Kong": imdb.com/title/tt0923752
BassKozz
A palavra correta para um objeto de uma frase é "ti".
Pausado até novo aviso.
3
Você disse "pegue-o" aqui e "Obrigado" abaixo. Deveria ser "pegue-o" e "Graças a ti".
Pausado até novo aviso.

Respostas:

19

Na 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
François Feugeas
fonte
PERFEITO!!! Graças defraagh, deve ter sentido falta disso no homem.
BassKozz 21/12/2009
É bom saber :-) #
21409
9

Se você fizer um screen -list, notará 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.

A partir daí, basta enviar um sinal KILL para esse PID específico:

$ kill 12281

e isso matará a tela específica.

ℝaphink
fonte
isso não funcionará porque estou executando-o a partir de um script bash, e prefiro não precisar puxar o PID da lista de telas que corresponde à tela correta ... a resposta de defraagh acima funcionou como um encanto. Obrigado, tu.
BassKozz 21/12/2009
Ok, é bom que o defraagh tenha uma solução perfeita para isso.
21410 as
1

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

screen -list obtenha o ID do processo

kill -9 PROCESSID

tela - limpe SESSIONID

garconcn
fonte
1

Se você tiver várias telas com o mesmo nome, poderá matá-las de uma vez:

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

    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)
    
  • egrepFiltros de comando acima do texto de amostra enviado via linha canalizada | .

  • O comando awk -F "." '{print $1}'extrai a primeira coluna de cada linha. O delimitador entre colunas é definido como ponto (.) Pela opção -F
  • Finalmente, o comando xargs killmata todos os processos cujos números são enviados via pipe. xargsé usado quando queremos executar um comando em cada uma das entradas.
Mohsen Abasi
fonte
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

Thomas Webber
fonte
0

Eu tenho lidado com isso da seguinte maneira:

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

A explicação é que você pega a saída screen -lse encontra a tela específica em que está interessado usando grep e depois atribui essa string à variável process.

Como a saída de screen -lssempre é o PID seguido de um período, você pode usar o cut para se livrar do período e de tudo o que se segue a ele. no exemplo acima, colocamos isso entre parênteses e o alimentamos com 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 se certificar de que seu nome de tela seja único e que grep retorne SOMENTE o nome da tela que você deseja eliminar.

uniforme
fonte