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
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
A voir également:
- Utiliser un screen dans un dossier BASH
- Comment utiliser un chromecast - Guide
- Dossier appdata - Guide
- Mettre un mot de passe sur un dossier - Guide
- Impossible de supprimer un dossier - Guide
- Screen whatsapp - Accueil - Messagerie instantanée
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
Modifié le 15 nov. 2021 à 14:51
Bonjour,
Pour manipuler plusieurs
Pour fermer un
Bonne chance
Pour manipuler plusieurs
screens depuis un script shell, cette discussion.
Pour fermer un
screen, voir cette discussion.
Bonne chance
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
Modifié le 18 nov. 2021 à 15:17
Bonjour,
Puisque tu dis débuter, avant de rentrer dans les explications de
A) Les commandes
Avant d'expliquer
En shell, on peut exécuter n'importe quelle commande en arrière plan (background en anglais) de deux manières :
Cela signifie que dans ton script shell, tu pourrais très bien lancer tes trois commandes java comme suit, sans
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
Ce n'est pas le cas de la commande
C) La commande
La plupart du temps,
D) La commande
C'est la que
D.1) Créer des sessions
Une session se crée avec une commande du style :
Exemple : Ici on initialise ces deux sessions, chacune
Les noms des sessions sont arbitraires, mais :
D.2) Lister les sessions
On peut utiliser au choix :
Exemple :
Dans mon exemple, les noms exacts des deux sessions sont
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
Pourquoi est-ce que le PID fait partie du nom de la session ? C'est un choix dans le design de la commande
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,
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 :
Exemple :
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
D.5) Lancer une tâche dans une session existante
On s'inspire de cette discussion, où il est question de l'option
Dans l'exemple ci-dessous, on crée successivement une session nommée
D.6) Pour aller plus loin
Les raccourcis de
Pour plus de détails sur la signification des différentes options que l'on peut passer à la commande
Bonne chance
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
fget
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 commandefg
(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
mancorrespondante (souvent
-d).
Ce n'est pas le cas de la commande
java, mais heureusement, il existe deux solutions pour contourner le problème :
nohupet
screen.
C) La commande
nohup.
nohupest à 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,
nohupest amplement suffisant. Cependant
nohupest 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
screenentre en jeu.
screenpermet 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
pingrespectivement 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.session2et
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
screenau 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
session1mê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,
screenpermet de désigner une session en étant "approximatif" dans son nom (on peut donc se contenter de
session2au 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
^Mse 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.frpuis 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
screensont 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
Modifié le 17 nov. 2021 à 19:32
Si vous pouvez m'aidez, ça me serait très utile.
Merci quand même