Comment puis-je tuer tous les écrans?

76

J'ai accidentellement créé plus de 1000 écrans. Comment puis-je tous les tuer avec une seule commande? (Ou quelques-uns)

BrainStone
la source
3
courir ->screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs kill
samedi
Bonne idée @sactiw. Je l'ai modifié pour fonctionner avec mes sessions nommées et ai légèrement modifié les commandes, en nettoyant complètement les sessions au cas où elles seraient «bloquées» comme elles l'étaient pour moi, et en listant à nouveau pour l'utilisateur comme un screen -ls | grep "<name>" | cut -d. -f1 | tr --delete "\t" | xargs kill -9; screen -wipe; screen -ls;
test de cohérence
3
Comment avez-vous créé accidentellement 1000 écrans?
duhaime

Réponses:

95

Vous pouvez utiliser :

pkill screen

Ou

killall screen

Sous OSX, le processus s'appelle SCREEN en majuscules. Alors, utilisez:

pkill SCREEN

Ou

killall SCREEN
Rahul Patil
la source
2
Il n'est pas recommandé d'utiliser SIGKILL dans ce cas. SIGTERM serait un bien meilleur choix.
Marco
Salut, Rahul Patil. pourquoi l'écran n'est pas répertorié dansTop
user15964
Et si je n'ai pas de permissions? Dois-je entrer et sortir manuellement de tous les écrans individuellement?
hipoglucido
13

Si les écrans sont morts, utilisez:

screen -wipe
Adam_G
la source
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
la source
5

J'ai récemment commencé à me familiariser avec awk. Je l'ai posté depuis que c'est assez facile à comprendre.

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

screen -lsrépertorie tous les écrans actuels. grep 'pattern'filtre toutes les lignes correspondantes. Nous pouvons alors obtenir une poignée pour tous les écrans détachés et avec awk sys {command}nous pouvons copier et coller ensemble une commande et l'exécuter avec sys, $1fait référence au premier argument repris par awk. Enfin, nous exécutons la commande quit avec screen -X quit.

Eliassen
la source
1
screen -ls | grep '(Detached)' | awk '{print $1}' | xargs -I % -t screen -X -S % quit a fonctionné mieux pour moi.
Whereisalext
2

Je suis un peu perplexe sur la façon dont vous avez réussi à créer 1000 "écrans". Voulez-vous dire peut-être 1 000 fenêtres d'écran (1 000 fenêtres de terminaux différentes au sein d'une même session d'écran)?

Si vous vouliez parler de 1000 fenêtres dans une seule session d'écran, une solution plus élégante consisterait à quitter l'écran à l'aide de la commande C-a \(ctrl-a suivi de \).

Railgun2
la source
1
Essayez d’exécuter screen 1000x dans screen. Ce qui se produit? Vous obtenez 1000 fenêtres d'écran. Oui, c'est vrai, l'écran intelligemment et heureusement ne génère pas 1000 sessions d'écran. Donc, si l'OP avait déjà démarré l'écran, il serait beaucoup plus facile de démarrer accidentellement 1000 fenêtres d'écran que de démarrer 1000 sessions d'écran.
Railgun2
Étrange, mais le commentaire auquel je répondais semble avoir disparu. Quoi qu'il en soit, je laisse le commentaire ci-dessus rester pour le compte rendu.
Railgun2
1
En fait, c'est assez simple. Il suffit de faire une boucle infinie (par accident) et de mettre quelque chose comme ça là-dedans screen -m sleep 100000. Ceci est arrivé et je ne l'ai pas remarqué avant que cela ait déjà créé plus de 1000 sessions d'écran.
BrainStone
0

La commande suivante mettra fin à tous les écrans inactifs:

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