Como eu mato todas as telas?

76

Eu acidentalmente criei mais de 1000 telas. Como eu mato todos eles com um comando? (Ou alguns)

BrainStone
fonte
3
executar ->screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs kill
sactiw
Boa ideia @sactiw. Modifiquei-o para trabalhar com minhas sessões nomeadas e ajustei um pouco os comandos, de preferência, limpando completamente as sessões, caso elas fiquem 'presas' como estavam para mim, e listando novamente para o usuário como verificação de sanidade:screen -ls | grep "<name>" | cut -d. -f1 | tr --delete "\t" | xargs kill -9; screen -wipe; screen -ls;
Pysis
3
Como você criou acidentalmente 1000 telas?
Duhaime

Respostas:

95

Você pode usar :

pkill screen

Ou

killall screen

No OSX, o processo é chamado de TELA em todas as maiúsculas. Então, use:

pkill SCREEN

Ou

killall SCREEN
Rahul Patil
fonte
2
Não é recomendável usar o SIGKILL neste caso. SIGTERM seria uma escolha muito melhor.
Marco
Olá, Rahul Patil. por que a tela não está listada emTop
user15964
E se eu não tiver permissões? Preciso entrar e sair manualmente de todas as telas individualmente?
hipoglucido
13

Se as telas estiverem inoperantes, use:

screen -wipe
Adam_G
fonte
6
str=$(screen -ls)  

array=$(echo $str|tr "." "\n")  

for V in $array  
do  
if [ $V -gt 0  ]  
        then screen -S $V -X quit  
fi  
done 
Don Wei
fonte
5

Recentemente, comecei a me familiarizar com o awk. Eu juntei isso e ele serviu ao seu propósito. Eu postei, pois é muito fácil de entender.

screen -ls | grep '(Detached)' | awk 'sys {screen -S $1 -X quit}'

Onde screen -lslista todas as telas atuais. grep 'pattern'filtra todas as linhas correspondentes. Podemos então obter um identificador para todas as telas desanexadas e, com awk sys {command}isso, podemos copiar e colar um comando e executá-lo com sys, $1refere-se ao primeiro argumento escolhido pelo awk. Finalmente, executamos o comando quit com screen -X quit.

Eliassen
fonte
11
screen -ls | grep '(Detached)' | awk '{print $1}' | xargs -I % -t screen -X -S % quit funcionou melhor para mim.
whereisalext
2

Estou um pouco confuso sobre como você conseguiu criar 1000 "telas". Você talvez quis dizer 1000 janelas de tela (1000 janelas de terminal diferentes em uma única sessão de tela)?

Se você quisesse 1000 janelas em uma sessão de tela única, uma solução mais elegante seria sair da tela usando o comando C-a \(ctrl-a seguido por \).

Railgun2
fonte
11
Tente executar a tela 1000x na tela. O que acontece? Você recebe 1000 janelas de tela. Sim, isso mesmo, a tela de maneira inteligente e misericordiosa não gera 1000 sessões de tela. Portanto, se o OP já havia iniciado a tela, seria muito mais fácil iniciar acidentalmente 1000 janelas de tela do que iniciar 1000 sessões de tela.
Railgun2
Estranho, mas o comentário ao qual eu estava respondendo parece ter desaparecido. De qualquer forma, estou deixando o comentário acima representar o registro.
Railgun2
11
Bem, na verdade é bem simples. Basta fazer um loop infinito (por acidente) e colocar algo assim lá screen -m sleep 100000. Isso aconteceu e eu não percebi até que ele já tivesse criado mais de 1000 sessões de tela.
21313 BrainStone
0

O comando a seguir encerrará todas as telas inativas:

perl -e 'while (map { kill 9, [split /\./]->[0] } grep { /Detached/ } split /\n/, qx{screen -ls}) { sleep 1 } exec qw(screen -wipe)'
Michael Vu
fonte
0
for scr in $(screen -ls | awk '{print $1}'); do screen -S $scr -X kill; done
user370823
fonte