Utiliser un screen dans un dossier BASH
Bonjour,
J'ai fait un dossier bash pour lancer les multiples serveurs en ne faisant qu'une commande :
Le problème étant que quand je démarres un
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
-
Bonjour,
Pour manipuler plusieursscreen
s depuis un script shell, cette discussion.
Pour fermer unscreen
, voir cette discussion.
Bonne chance -
Bonjour,
Puisque tu dis débuter, avant de rentrer dans les explications descreen
, j'aimerais te parler de quelques commandes qui pourraient t'intéresser.
A) Les commandesfg
etbg
.
Avant d'expliquerscreen
, 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 commandefg
(foreground).
Cela signifie que dans ton script shell, tu pourrais très bien lancer tes trois commandes java comme suit, sansscreen
:
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 deman
correspondante (souvent-d
).
Ce n'est pas le cas de la commandejava
, mais heureusement, il existe deux solutions pour contourner le problème :nohup
etscreen
.
C) La commandenohup
.
nohup
est à mi-chemin entre&
etscreen
: 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. Cependantnohup
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 commandescreen
.
C'est la quescreen
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, chacuneping
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 sont29190.session2
et29185.session1
. Ce nom permet d'interagir au niveau de ton shell avec une session (les commandes seront du genrescreen -S 29190.session2 ...
pour la sessionsession2
.
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 commandeps -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'instrumenterscreen
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 commandescreen
. 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'appellesession1
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 desession2
au lieu de29190.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 commandequit
:
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éesession3
, dans laquelle on exécute la commandeping 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 descreen
sont disponibles en faisant ctrl+a+?.
Pour plus de détails sur la signification des différentes options que l'on peut passer à la commandescreen
, je te renvoie àman screen
.
Bonne chance