Utiliser un screen dans un dossier BASH

ItoKube Messages postés 2 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

J'ai fait un dossier bash pour lancer les multiples serveurs en ne faisant qu'une commande :

#! /bin/bash

echo "Demarrage des serveur automatiques : 0%"
pkill screen
cd home/mc/bc
echo # screen -S bc
java -Xmx3G -jar bin.jar
cd ../lobby
echo # screen -S lobby
java -Xmx8G -jar bin.jar
echo "Le lobby est on et accessible (30%)"
cd ../fac
echo # screen -S fac
java -Xmx20G -jar bin.jar
echo "Le Faction est on et accessible (50%)"
cd ../minage
echo # screen -dmS mine
java -Xmx12G -jar bin.jar
echo  "Le Minage est on et accessible (70%)"
cd ../quete1
echo # screen -S q1
java -Xmx5G -jar bin.jar
cd ../quete2
echo # screen -S q2
java -Xmx5G -jar bin.jar
echo "Les Serveurs Quetes sont on et accessibles (100%)"
echo "Pour acceder aux panels des serveurs, executé :"
echo "Bungeecord : 'screen -r bc'"
echo "Lobby : 'screen -r lobby'"
echo "Factions : 'screen -r fac'"
echo "Minage : 'screen -r mine'"
echo "Quetes1 : 'screen -r q1'"
echo "Quetes2 : 'screen -r q2'"


Le problème étant que quand je démarres un
screen
, les commandes suivantes ne se font pas dedans. J'aimerais aussi savoir quelle est là commande pour quitter le screen comme nous ne pouvons pas faire ctrl + a + d.

2 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour,

    Pour manipuler plusieurs
    screen
    s depuis un script shell, cette discussion.

    Pour fermer un
    screen
    , voir cette discussion.

    Bonne chance
    0
    1. ItoKube Messages postés 2 Statut Membre
       
      Je n'arrive pas à intégrer les éléments écrits sur le forum dans mon script, le post n'est pas assez clair pour un débutant comme moi.
      Si vous pouvez m'aidez, ça me serait très utile.
      Merci quand même
      0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour,

    Puisque tu dis débuter, avant de rentrer dans les explications de
    screen
    , j'aimerais te parler de quelques commandes qui pourraient t'intéresser.

    A) Les commandes
    fg
    et
    bg
    .

    Avant d'expliquer
    screen
    , il faut se demander s'il est vraiment utile.

    En shell, on peut exécuter n'importe quelle commande en arrière plan (background en anglais) de deux manières :
    • soit en faisant suivre la commande de l'opérateur &
    • soit en lançant la commande, en faisant ctrl+z (pour geler le processus et récupérer la main dans le shell), puis en lançant
      bg
      (background) pour que la tâche gelée soit lancée en arrière plan. Il est possible de ramener la tâche en arrière plan avec la commande
      fg
      (foreground).


    Cela signifie que dans ton script shell, tu pourrais très bien lancer tes trois commandes java comme suit, sans
    screen
    :

    java -Xmx20G -jar bin.jar &
    cd ../minage
    java -Xmx12G -jar bin.jar &
    cd ../quete1
    java -Xmx5G -jar bin.jar &
    #...


    Le problème c'est que la durée de vie de ces trois commandes est liée à celle de leur shell. Par exemple, si tu te connectes en ssh à un serveur, lance un long calcul de cette manière, dès que tu quittes ta session ssh, le shell associé (et ses tâches en arrière plan) meurent. Et donc ton long calcul est interrompu !

    B) Les démons.

    Certains exécutables peuvent se lancer directement en arrière plan (on parle de démon), et c'est le cas de tous les services qui tournent en arrière plan. Une option est alors explicitement dédiée dans la page de
    man
    correspondante (souvent
    -d
    ).

    Ce n'est pas le cas de la commande
    java
    , mais heureusement, il existe deux solutions pour contourner le problème :
    nohup
    et
    screen
    .

    C) La commande
    nohup
    .

    nohup
    est à mi-chemin entre
    &
    et
    screen
    : il permet de lancer une commande arbitraire en arrière plan, sauf que contrairement à l'opérateur
    &
    ,
    nohup
    "survit" au shell qui l'a lancé.

    nohup java -Xmx20G -jar bin.jar &
    cd ../minage
    nohup java -Xmx12G -jar bin.jar &
    cd ../quete1
    nohup java -Xmx5G -jar bin.jar &
    #...


    La plupart du temps,
    nohup
    est amplement suffisant. Cependant
    nohup
    est un peu limitant si on veut récupérer les résultats que les commandes écrivent dans le terminal (dans la sortie standard et dans la sortie d'erreur standard), car cela oblige à passer par des fichiers :

    nohup myprogram 1> myprogram.out 2> myprogram.err


    D) La commande
    screen
    .

    C'est la que
    screen
    entre en jeu.
    screen
    permet d'avoir en quelque sorte plusieurs terminaux qui tournent en arrière plan qu'on peut afficher ou masquer à volonté.

    D.1) Créer des sessions

    Une session se crée avec une commande du style :

    screen -S nom_de_la_session -dm [commande]
    • L'option
      -S
      nomme la session
    • Les options
      -d -m
      (=
      -dm
      ) signifient que la session est détachée (c'est-à-dire qu'elle tourne en arrière-plan).
    • Derrière
      -dm
      on peut ou non passer une commande pour lui donner du grain à moudre.


    Exemple : Ici on initialise ces deux sessions, chacune
    ping
    respectivement vers google et facebook.

    screen -S session1 -dm ping www.google.fr
    screen -S session2 -dm ping www.facebook.fr


    Les noms des sessions sont arbitraires, mais :
    • on utilise des noms plus parlants pour s'y retrouver ;
    • on évite de nommer de la même manière deux sessions (cela évite les ambiguïtés, voir plus loin).


    D.2) Lister les sessions

    On peut utiliser au choix :
    screen -ls
    screen -list


    Exemple :

    (mando@silk) (~) $ screen -list
    There are screens on:
    29190.session2 (17/11/2021 19:41:09) (Detached)
    29185.session1 (17/11/2021 19:41:07) (Detached)
    2 Sockets in /run/screen/S-mando.


    Dans mon exemple, les noms exacts des deux sessions sont
    29190.session2
    et
    29185.session1
    . Ce nom permet d'interagir au niveau de ton shell avec une session (les commandes seront du genre
    screen -S 29190.session2 ...
    pour la session
    session2
    .

    Que signifie cet entier ? L'entier qui préfixe le nom de la session est le PID (processus identifier) de la session. Ce nombre est attribué par le système d'exploitation à tout nouveau processus et permet de l'identifier de manière unique (tu le retrouves dans la commande
    ps -faux
    ). Le hic, c'est qu'on ne peut pas anticiper quel PID le système va attribuer à l'avance, ce qui est assez problématique si l'idée est d'instrumenter
    screen
    au travers d'un script shell.

    Pourquoi est-ce que le PID fait partie du nom de la session ? C'est un choix dans le design de la commande
    screen
    . En effet, rien ne garantit qu'un nom de session n'est pas déjà utilisé. Rien ne t'empêche de créer une session nouvelle qui s'appelle
    session1
    même s'il en existe déjà une. Grâce au PID, les deux sessions ont un nom au final différent et sont donc distinguables. Ça reste néanmoins une mauvaise idée, il vaut mieux choisir des noms non utilisés afin d'éviter les ambiguïtés.

    Dois-je me soucier du PID ? Heureusement, la plupart du temps, non, mais sous réserve que tes sessions sont nommées de manière non ambigües. En effet,
    screen
    permet de désigner une session en étant "approximatif" dans son nom (on peut donc se contenter de
    session2
    au lieu de
    29190.session2
    .

    Dans tout ce qui suit, je fais l'hypothèse que les sessions sont nommées de manière non ambiguës.

    D.3) Entrer/sortir dans une session existante

    S'attacher à une session : Pour se rattacher à une session détachée (= entrer dans une sessions détachée = la faire apparaître à l'écran = la refaire passer au premier plan), on utilise :

    screen -r nom_de_la_session
    .

    Exemple :

    screen -r session1


    Se détacher de la session : Pour se détacher d'une session (= mettre en arrière plan quitter la session actuellement attachée à l'écran), il suffit d'appuyer sur ctrl+alt+d. Se détacher d'une session n'interrompt pas les tâches qu'elle exécute.

    Fermer une session : Il ne faut donc pas confondre se détacher d'une session et fermer une session (ctrl+alt+\). Quand on ferme une session, les tâches qu'elle exécute sont également interrompues.

    D.4) Fermer une session

    Il suffit d'exécuter dans la session concernée la commande
    quit
    :

    screen -S session2 -X quit
    screen -list


    D.5) Lancer une tâche dans une session existante

    On s'inspire de cette discussion, où il est question de l'option
    -X stuff
    . Il y est notamment expliqué que
    ^M
    se tape en faisant ctrl+v puis entrée.

    Dans l'exemple ci-dessous, on crée successivement une session nommée
    session3
    , dans laquelle on exécute la commande
    ping www.google.fr
    puis on se rentre dans cette session pour vérifier que la commande a bien été exécutée.

    screen -S session3 -dm
    screen -S session3 -p 0 -X stuff "ping www.google.fr^M"
    screen -r session3


    D.6) Pour aller plus loin

    Les raccourcis de
    screen
    sont disponibles en faisant ctrl+a+?.

    Pour plus de détails sur la signification des différentes options que l'on peut passer à la commande
    screen
    , je te renvoie à
    man screen
    .

    Bonne chance
    0