tuer un écran (mais pas tous les écrans)

19

J'ai plusieurs écrans fonctionnant sur un serveur Ubuntu qui sont lancés comme:

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

Et je dois tuer un écran, mais pas tous. Quelle est la bonne commande pour tuer un seul écran particulier avec son nom? J'ai lu les pages de manuel mais je n'arrive pas à trouver la commande que je recherche.

Aussi, je veux écrire cette commande dans un script bash, donc je ne peux pas simplement screen -r screen1appuyer sur Ctrl+ Xcomme je le ferais normalement.

BassKozz
la source
Désolé,
je
J'adore ce t-shirt ohgizmo.com/wp-content/uploads/2008/11/…
Chopper3
C'est un joli tee-shirt, la plupart des gens ne l'obtiendront pas, à moins d'avoir vu "The King of Kong": imdb.com/title/tt0923752
BassKozz
Le mot correct pour un objet d'une phrase est "toi".
pause jusqu'à nouvel ordre.
3
Vous avez dit "obtenez-le" ici et "merci" ci-dessous. Cela devrait être "obtenez-le [pour] vous" et "Merci [à vous]".
pause jusqu'à nouvel ordre.

Réponses:

19

Depuis la page de manuel:

   -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 peux faire :

        screen -X -S <sessionid> kill
François Feugeas
la source
PARFAIT!!! Merci defraagh, musta a manqué ça chez l'homme.
BassKozz
Bon à savoir :-)
ℝaphink
9

Si vous faites un screen -list, vous remarquerez que chaque nom d'écran commence par un nombre, qui est le PID de l'écran:

 $ 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à, envoyez simplement un signal KILL à ce PID spécifique:

$ kill 12281

et cela tuera l'écran spécifique.

ℝaphink
la source
cela ne fonctionnera pas parce que je l'exécute à partir d'un script bash, et je préfère ne pas avoir à extraire le PID de screen -list qui correspond à l'écran correct ... la réponse de defraagh ci-dessus a fonctionné comme un charme. Merci.
BassKozz
Bon, bon, cette fraude avait une solution parfaite.
ℝaphink
1

La solution de defraagh ne fonctionne pas pour moi, mais je peux tuer la session d'écran en utilisant l'idée de Raphink:

screen -list obtenir l'ID du processus

kill -9 PROCESSID

écran-essuyer SESSIONID

garconcn
la source
1

Si vous avez plusieurs écrans avec le même nom, vous pouvez les tuer à la fois:

screen -ls  | egrep "^\s*[0-9]+.ScreenName" | awk -F "." '{print $1}' | xargs kill
  • La commande screen -lsimprime les écrans avec leur numéro de processus. Par exemple, 4773.test est un écran avec le numéro de processus 4773 et le test de nom . Exemple de sortie:

    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)
  • egrepFiltres de commande au-dessus de l'exemple de texte envoyé via la ligne piped | .

  • La commande awk -F "." '{print $1}'extrait la première colonne de chaque ligne. Le délimiteur entre les colonnes est défini comme un point (.) Par l'option -F
  • Enfin, la commande xargs killva tuer tous les processus dont les numéros envoyés via pipe |. xargsest utilisé lorsque nous voulons exécuter une commande sur chacune des entrées.
Mohsen Abasi
la source
0

Vous ouvrez une nouvelle fenêtre avec

Ctrl A + C

Vous fermez une fenêtre avec

Ctrl + D

ou quitter la commande dans la fenêtre

Thomas Webber
la source
0

Je l'ai traité comme suit:

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

L'explication est que vous prenez la sortie de screen -lset trouvez l'écran particulier qui vous intéresse en utilisant grep puis affectez cette chaîne à la variable process.

Comme la sortie de screen -lsest toujours le PID suivi d'un point, vous pouvez ensuite utiliser cut pour vous débarrasser du point et de tout ce qui se trouve après. dans l'exemple ci-dessus, nous mettons cela entre parenthèses et nous le transmettons à la commande kill, bien que vous puissiez le faire de manière linéaire, ce qui pourrait inclure l'écriture dans un fichier temporaire et la lecture de cela.

Vous devez vous assurer que votre nom d'écran est unique et que grep renvoie UNIQUEMENT le nom de l'écran que vous souhaitez tuer.

unifex
la source