web-dev-qa-db-fra.com

Vérification de l'existence d'un écran du nom spécifié

J'ai créé un fichier bash qui lance un autre fichier bash dans un écran détaché avec un nom unique, je dois m'assurer qu'une seule instance de ce fichier bash interne s'exécute à un moment donné. Pour ce faire, je veux faire vérifier le fichier bash parent pour voir si l'écran de ce nom existe avant d'essayer de le créer. Existe-t-il une méthode pour ce faire?

31
Zoey

Vous pouvez grep la sortie de screen -list pour le nom de la session que vous recherchez:

if ! screen -list | grep -q "myscreen"; then
    # run bash script
fi
29
chepner

Vous pouvez interroger la commande d'écran "sélectionner" pour une session particulière; le résultat du shell est "0" si la session existe et "1" si la session d'écran nommée est introuvable:

 
 $ screen -S Tomcat 
 $ screen -S Tomcat -Q select. ; écho $? 
 0 
 

contre:

 
 $ screen -S Jetty -Q select. ; echo $? 
 Aucune session d'écran trouvée. 
 1 
 

Notez que le '.' après le select est facultatif, mais peut être plus robuste.

17
troyfolger

Étant donné que je ne peux pas commenter, je poste ceci comme une nouvelle réponse. La réponse de troyfolger est une bonne idée et revient essentiellement à envoyer à la session une commande qui fera très peu. Un problème est que pour certaines versions (plus anciennes) de screen -Q n'est pas pris en charge et donc pour ces versions la commande correcte est

screen -S Jetty -X select . ; echo $?

Qui envoie la commande "sélectionner". à la session d'écran appelée "Jetty".

Sélectionnez les modifications de la fenêtre active et. signifie la fenêtre active actuelle, donc cela signifie essayer de changer la fenêtre active en la fenêtre actuellement active. Cela ne peut échouer que s'il n'y a pas de session à laquelle se connecter, ce que nous voulions.

Si vous lisez les documents d'information, cela suggère que la seule utilisation de select. est avec -X comme test ou pour s'assurer que quelque chose est sélectionné.

8
staircase27

Toutes les solutions proposées ne traitent pas des noms d'écran qui n'ont pas de modèles uniques, par exemple "TEST" et "TEST123". Lorsque vous screen -S "TEST" ou screen -list "TEST", vous pouvez vous retrouver en sélectionnant l'écran "TEST123"! Il y a quelque chose qui ne va pas (non déterministe) dans la façon dont GNU screen implémente la correspondance des noms d'écran.

Ci-dessous se trouve une fonction bash qui essaie de faire des correspondances exactes et retourne le PID.SCREEN NAME avec un code de sortie:

function find_screen {
    if screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1 -q >/dev/null; then
        screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1 2>/dev/null
        return 0
    else
        echo "$1"
        return 1
    fi
}

Utilisation - sélectionnez un écran:

target_screen=$(find_screen "SCREEN NAME")
screen -S "$target_screen" ...etc...

Utilisation - tester si un écran existe:

if find_screen "SCREEN NAME" >/dev/null; then
    echo "Found!"
fi

Quoi qu'il en soit, cela couvrira 99,9% des cas. Pour être sûr à 99,99%, échappez aux caractères spéciaux grep dans le nom d'écran. Une correspondance parfaite nécessiterait que grep fasse correspondre la ligne entière jusqu'à $, y compris la date entre parenthèses qui peut évoluer avec les versions. L'autre méthode de correspondance parfaite serait:

ls -A -1 /var/run/screen/S-${USER} | grep "^[0-9]*\.SCREEN NAME$"

Mais c'est hacky, et nous devons être sûrs que l'implémentation d'écran utilise ce dossier. Je ne recommande pas cette dernière méthode.

2
KrisWebDev

une méthode plus simple est:

screen -xR -S SessionName

copié à partir d'un Stéphane Chazelas commentaire de ici :

J'utilise généralement -xR pour attacher ou créer s'il n'y a rien à attacher.

donc comme ça vous n'avez pas à chercher si le nom de la session existe déjà, cette méthode s'attachera à la session si elle existe et sinon elle la créera.

0
Badr Elmers

% 100 travail.

screen -list | grep "SESSİON NAME" && echo "Active Program" || echo "Passive Program"
0
Anıl Eroglu