Résolu le 7-09-23 Deux questions concernant screen

Postez ici toutes vos demandes d’assistance.
Avatar du membre
damad
Messages : 99
Enregistré le : jeu. 17 août 2023 14:06
Localisation : Neuchâtel, Suisse

Deux questions concernant screen

Message par damad »

Bonjour à tous !!

J'utilise screen que je trouve génial pour différentes tâches de fond. Et comme d'habitude, je m'amuse à faire des scripts pour automatiser ces tâches. Mais malgré la doc lue et relue, j'ai un souci... Je m'explique.

Voilà un script qui ouvre le screen AAA et y lance le script TEST.sh du dossier /$HOME/bin :

Code : Tout sélectionner

#!/bin/bash

screen -dmS AAA sh
screen -S AAA -X stuff "cd /$HOME/bin/
"
screen -S AAA -X stuff "./TEST.sh
"
Avec screen -ls, on voit le screen AAA et avec screen -r AAA, on voit que TEST.sh est en cours :

Code : Tout sélectionner

ced@Ced-Mint:~$ screen -ls 
There is a screen on: 
	7227.AAA	(01. 09. 23 15:19:22)	(Detached) 
1 Socket in /run/screen/S-ced. 
ced@Ced-Mint:~$ screen -r AAA

Code : Tout sélectionner

$ cd //home/ced/bin/ 
$ ./TEST.sh 
TEST.sh en cours 
Appuyer sur Entrée pour quitter le script. 
C'est bien ce que je voulais. Maintenant, voilà un script qui tue TEST.sh et ferme le screen AAA :

Code : Tout sélectionner

#!/bin/bash

sudo pkill TEST.sh
screen -S AAA -X stuff "exit
"
screen -ls donne :

Code : Tout sélectionner

ced@Ced-Mint:~$ screen -ls 
No Sockets found in /run/screen/S-ced. 

ced@Ced-Mint:~$ 
Comme prévu, TEST.sh a été tué et la session screen AAA a été fermée.

Et voici mon problème. Certaines fois, la session screen AAA ne se ferme pas après avoir tué TEST.sh. Ainsi, si je relance mon premier script, une deuxième session screen AAA est créée. Et lorsque le script lance TEST.sh, ce n'est pas possible, car il y a les deux sessions du même nom.

D'où deux questions :

1) Dans un script, comment empêcher la création d'une session screen avec un nom déjà existant ?

2) Dans un script, comment fermer plusieurs sessions screen du même nom ?

Bien sûr, je peux faire tout ça manuellement, mais le but est de faire un script où tout se passe parfaitement en silence.

Merci d'avance aux adeptes de screen pour vos réponses !!
Pc 1 : Portable CLEVO W150HRM | Linux Mint 21.1 Vera | Cinnamon 5.6.8 | 5.15.0-122-generic x86_64 | Quad core Intel Core i7-2720QM | 8 Go | 1: Intel 2nd Generation Core Processor Family Integrated Graphics 2: NVIDIA GF106M [GeForce GT 555M]

Pc 2 : Portable Acer Predator PH18-72 v: V1.06 | Linux Mint 22 Wilma | Xfce v: 4.18.1 | 6.8.0-45-generic arch: x86_64 bits | Intel Core i9-14900HX | 32 Go | 1: Intel Raptor Lake-S UHD Graphics 2: NVIDIA AD104M [GeForce RTX 4080 Max-Q / Mobile]

Avatar du membre
cyrille
Administrateur du site
Messages : 13037
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Deux questions concernant screen

Message par cyrille »

Code : Tout sélectionner

ps aux | grep screen
Te retournera les process ouverts
A coup de cut ou de awk, tu récupères leur ID puis une boucle bash qui les tue les uns après les autres

A tester ;)
(par contre , jamais utilisé screen, désolé ...)
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
damad
Messages : 99
Enregistré le : jeu. 17 août 2023 14:06
Localisation : Neuchâtel, Suisse

Re: Deux questions concernant screen

Message par damad »

Merci cyrille !! :D

Code : Tout sélectionner

ps aux | grep screen
renvoie effectivement tous les processus en cours qui comportent screen. Même ceux qui ne sont pas liés à la commande screen, comme xscreensaver. C'est un début. Avant de m'attaquer aux cut et awk et en m'inspirant de ton code, j'ai fait des essais pour restreindre la recherche :

Code : Tout sélectionner

screen -ls | grep AAA
screen -ls est la commande interne à screen qui liste les screens ouverts. Ainsi, ce code ne renvoie que les screens ouverts comportant AAA. Je m'approche !!

J'ai donc affiné mes recherches sur le net et j'ai trouvé ça :

https://unix.stackexchange.com/question ... -screen-id

d'où j'ai pu tirer ce code (adapté à mon exemple) :

Code : Tout sélectionner

kill -15 $(screen -ls | grep '[0-9]*\.AAA' | sed -E 's/\s+([0-9]+)\..*/\1/')
ce qui répond exactement à ma deuxième question !!

En partant de là, je devrais pouvoir trouver la réponse à ma première question. Dans ce cas, je posterai la solution. Mais si quelqu'un la connaît, je suis preneur !!
Pc 1 : Portable CLEVO W150HRM | Linux Mint 21.1 Vera | Cinnamon 5.6.8 | 5.15.0-122-generic x86_64 | Quad core Intel Core i7-2720QM | 8 Go | 1: Intel 2nd Generation Core Processor Family Integrated Graphics 2: NVIDIA GF106M [GeForce GT 555M]

Pc 2 : Portable Acer Predator PH18-72 v: V1.06 | Linux Mint 22 Wilma | Xfce v: 4.18.1 | 6.8.0-45-generic arch: x86_64 bits | Intel Core i9-14900HX | 32 Go | 1: Intel Raptor Lake-S UHD Graphics 2: NVIDIA AD104M [GeForce RTX 4080 Max-Q / Mobile]

Avatar du membre
cyrille
Administrateur du site
Messages : 13037
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Deux questions concernant screen

Message par cyrille »

oui

Code : Tout sélectionner

$(commande)
est une écriture simplifiée de passage de variable ;)
Bon développement ++
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
cyrille
Administrateur du site
Messages : 13037
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Deux questions concernant screen

Message par cyrille »

1) Dans un script, comment empêcher la création d'une session screen avec un nom déjà existant ?

[Si le retour existe]
alors tuer le process
sinon le lancer

?

Juste une idée...
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
damad
Messages : 99
Enregistré le : jeu. 17 août 2023 14:06
Localisation : Neuchâtel, Suisse

Re: Deux questions concernant screen

Message par damad »

Oui cyrille, et ça donne ça dans mon exemple :

Code : Tout sélectionner

#!/bin/bash

if screen -ls | grep AAA > /dev/null
	then
		echo "Une session screen AAA est déjà en cours."
	else
		echo "Aucune session screen AAA n'est en cours."
fi
C'est tellement simple que je n'y avait pas pensé... Bien sûr, je remplacerai les « echo » par des commandes, mais ça fonctionne.

En tout cas merci cyrille, tu m'as mis sur les bonnes voies pour résoudre mon problème !!

Je laisse ce sujet ouvert encore un petit moment, si quelqu'un a une autre solution, mais en l'état, ça fonctionne très bien !!
Pc 1 : Portable CLEVO W150HRM | Linux Mint 21.1 Vera | Cinnamon 5.6.8 | 5.15.0-122-generic x86_64 | Quad core Intel Core i7-2720QM | 8 Go | 1: Intel 2nd Generation Core Processor Family Integrated Graphics 2: NVIDIA GF106M [GeForce GT 555M]

Pc 2 : Portable Acer Predator PH18-72 v: V1.06 | Linux Mint 22 Wilma | Xfce v: 4.18.1 | 6.8.0-45-generic arch: x86_64 bits | Intel Core i9-14900HX | 32 Go | 1: Intel Raptor Lake-S UHD Graphics 2: NVIDIA AD104M [GeForce RTX 4080 Max-Q / Mobile]

Avatar du membre
cyrille
Administrateur du site
Messages : 13037
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Deux questions concernant screen

Message par cyrille »

Cool mais attention à la syntaxte , en bash la condition est entre crochet (légèrement différent en sh)

Code : Tout sélectionner

if [ test ]; then
    echo "OK"
fi
cf https://buzut.net/maitriser-les-conditions-en-bash/
;)
ça évite de perdre ensuite son temps sur des erreurs de debuggage ;)
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
damad
Messages : 99
Enregistré le : jeu. 17 août 2023 14:06
Localisation : Neuchâtel, Suisse

Re: Deux questions concernant screen

Message par damad »

Merci cyrille pour ces précisions !! :D

J'ai donc essayé de mettre des crochets et quelque soit leurs emplacements, ça me renvoie des codes d'erreur. A noter que j'ai bien respecté l'espace après le premier crochet et l'espace avant le deuxième. A noter aussi que je n'ai pas d'erreur sans les crochets.

J'ai donc bien relu ton lien et voilà ce qui est écrit vers la fin  :-o :
Au delà du test et de la commande [ ], il est possible d’appliquer une condition sur le code de retour d’une commande.

Code : Tout sélectionner

if grep -q "php" /var/www/index.php; then echo "ce fichier contient du php"; fi
Ici, il n'y a pas de crochet. Et comme je cherche exactement à « appliquer une condition sur le code de retour d’une commande », dois-je en conclure que dans mon exemple, je ne dois précisément pas mettre de crochets ?
Pc 1 : Portable CLEVO W150HRM | Linux Mint 21.1 Vera | Cinnamon 5.6.8 | 5.15.0-122-generic x86_64 | Quad core Intel Core i7-2720QM | 8 Go | 1: Intel 2nd Generation Core Processor Family Integrated Graphics 2: NVIDIA GF106M [GeForce GT 555M]

Pc 2 : Portable Acer Predator PH18-72 v: V1.06 | Linux Mint 22 Wilma | Xfce v: 4.18.1 | 6.8.0-45-generic arch: x86_64 bits | Intel Core i9-14900HX | 32 Go | 1: Intel Raptor Lake-S UHD Graphics 2: NVIDIA AD104M [GeForce RTX 4080 Max-Q / Mobile]

Avatar du membre
cyrille
Administrateur du site
Messages : 13037
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Deux questions concernant screen

Message par cyrille »

Tu dois faire un test sur la sortie de la commande
Le code de sortie est stocké dans la variable $?

Un exemple, on va tester si le paquet rfkill est déjà installé ou non

Code : Tout sélectionner

# Test de la présence des paquets nécessaires 
# ici rfkil
dpkg -s rfkill  &> /dev/null 

if [ $? -eq 0 ]; then    

    echo -e "\nrfkill est installé. Continuons.\n" 
else     
    echo -e "\nrfkill n'est pas installé. Installons le !\n"     
    apt-get install -y rfkill fi
Un peu de lecture (dsl en anglais)
https://tecadmin.net/check-if-a-command ... d-in-bash/
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
damad
Messages : 99
Enregistré le : jeu. 17 août 2023 14:06
Localisation : Neuchâtel, Suisse

Re: Deux questions concernant screen

Message par damad »

Merci cyrille et pas de souci pour l'anglais, ça me va très bien !! :D

Dans mon cas, ton script donne :

Code : Tout sélectionner

#!/bin/bash

screen -ls | grep -w AAA  &> /dev/null

if [ $? -eq 0 ]
then
    echo -e "\nUne session screen AAA est déjà en cours.\n"
else
    echo -e "\nAucune session screen AAA n'est en cours.\n\nCréation d'une session screen AAA.\n"
    screen -mdS AAA
fi
qui fonctionne très bien. Et j'ai bien compris le passage par la variable $?, qui est intéressant et astucieux. Et ça évite des problèmes de syntaxe, donc je garde !! ;)

Alors merci cyrille pour ton aide précieuse !! J'ai gardé tes liens dans ma boîte à outils, on ne sait jamais ;) ... Je classe donc le sujet en « résolu ».

A bientôt !!
Pc 1 : Portable CLEVO W150HRM | Linux Mint 21.1 Vera | Cinnamon 5.6.8 | 5.15.0-122-generic x86_64 | Quad core Intel Core i7-2720QM | 8 Go | 1: Intel 2nd Generation Core Processor Family Integrated Graphics 2: NVIDIA GF106M [GeForce GT 555M]

Pc 2 : Portable Acer Predator PH18-72 v: V1.06 | Linux Mint 22 Wilma | Xfce v: 4.18.1 | 6.8.0-45-generic arch: x86_64 bits | Intel Core i9-14900HX | 32 Go | 1: Intel Raptor Lake-S UHD Graphics 2: NVIDIA AD104M [GeForce RTX 4080 Max-Q / Mobile]

Répondre