Utiliser un screen dans un dossier BASH

Fermé
ItoKube Messages postés 2 Date d'inscription lundi 15 novembre 2021 Statut Membre Dernière intervention 15 novembre 2021 - Modifié le 15 nov. 2021 à 14:46
mamiemando Messages postés 33663 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 13 mai 2025 - 18 nov. 2021 à 14:43
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.
A voir également:

2 réponses

mamiemando Messages postés 33663 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 13 mai 2025 7 850
Modifié le 15 nov. 2021 à 14:51
Bonjour,

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

Pour fermer un
screen
, voir cette discussion.

Bonne chance
0
ItoKube Messages postés 2 Date d'inscription lundi 15 novembre 2021 Statut Membre Dernière intervention 15 novembre 2021
Modifié le 17 nov. 2021 à 19:32
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
mamiemando Messages postés 33663 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 13 mai 2025 7 850
Modifié le 18 nov. 2021 à 15:17
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