| Both sides previous revisionPrevious revisionNext revision | Previous revision | 
| informatique:logiciels:screen [2009/06/08 20:15]  – édition externe 127.0.0.1 | informatique:logiciels:screen [2020/12/03 10:11] (current)  – Copier le buffer dans un fichier pteu | 
|---|
| {{tag>utilitaire système session}} | ======Screen====== | 
|  |  | 
| ======SCREEN====== |  | 
|  |  | 
| =====Présentation===== | =====Présentation===== | 
|  |  | 
| **Screen** permet de créer un nouveau terminal qu'on pourra quitter, puis récupérer dans l'état ou on l'a laissé. On lance un nouveau terminal, on lance une application dedans, puis on le //détache//. L'application continue de tourner, et on peut, plus tard, récupérer le terminal en le //rattachant//. | **Screen** est un gestionnaire de terminal en mode texte ; il permet, dans un terminal, de créer de nouvelles sessions qu'on pourra quitter, puis récupérer dans l'état ou on l'a laissé. | 
|  |  | 
|  | //NB : Il existe d'autres gestionnaires de terminaux comme tmux ou byobu, une version améliorée de screen.// | 
|  |  | 
| =====Configuration===== |  | 
|  |  | 
| Le fichier de configuration se nomme ''.screenrc'', que l'on peut placer dans ''/etc'' ou ''~''. | =====Utilisation===== | 
|  |  | 
| Pour afficher une barre de statut : | Installation, lancement de screen et exécution d'une commande dedans : | 
|  | <code bash> | 
|  | aptitude install screen | 
|  |  | 
| hardstatus alwayslastline "%d/%m/%Y [%c] | %w" | screen | 
|  |  | 
| Pour éviter le message au lancement : | echo test | 
|  | test | 
|  | </code> | 
|  |  | 
| startup_message off | On va ensuite **d**étacher la console avec la combinaison ''Ctrl-a'' puis ''d'' ; on va donc revenir à la console depuis laquelle on a lancé screen. | 
|  |  | 
|  | //Plus tard// on décide de récupérer (**r**attacher) notre screen : | 
|  | <code bash> | 
|  | screen -r | 
|  | </code> | 
|  |  | 
| =====Utilisation===== | On récupère ainsi l'état dans lequel on l'avait laissé. | 
|  |  | 
| On installe et on lance screen : | On peut également **c**réer d'autres terminaux virtuels ; quand on est dans screen, faire un ''ctrl+a'' et ''c''. On passe alors de l'un à l'autre avec ''ctrl+a'' et ''n'' (**n**ext) ou encore ''ctrl+a'' et ''p'' (**p**revious). ''ctrl+a'' ''ctrl+a'' permet de revenir à l'ancien terminal virtuel. Pour fermer une session screen : ''Ctrl+a d'' (detach). | 
|  |  | 
| aptitude install screen | Pour la rejoindre plus tard : ''screen -x'' ou ''screen -r''. S'il en existe plusieurs, ''screen -r'' affichera la liste et il faudra ajouter l'ID de la session à la suite : | 
| screen | <code bash> | 
|  | screen -r | 
|  | There are several suitable screens on: | 
|  | 314..soekris-01 (Detached) | 
|  | 9364..soekris-01        (Detached) | 
|  | Type "screen [-d] -r [pid.]tty.host" to resume one of them. | 
|  |  | 
| Dans le terminal qu'on vient d'ouvrir, on lance un anodin | screen -r 314..soekris-01 | 
|  | </code> | 
|  |  | 
| echo test | Sinon, pour simplement lister les sessions existantes : ''screen -ls'' | 
| test |  | 
|  |  | 
| On va ensuite **d**étacher la console avec la combinaison ''ctrl+a'' puis ''d'' ; on va donc revenir à la console d'où on a lancer screen. | Pour lancer un script dans un screen au démarrage par exemple, on utilise : | 
|  | <code bash> | 
|  | screen -d -m script.sh | 
|  | </code> | 
|  | ... pour créer une nouvelle session sans l'attacher. | 
|  |  | 
| //Plus tard// on décide de récupérer (**r**attacher) notre screen : |  | 
|  |  | 
| screen -r | =====Combinaisons de touches===== | 
|  |  | 
| On récupère ainsi l'état dans lequel on l'avait laissé. | Pour afficher les raccourcis courants, appuyer sur la touche de préfixe ''Ctrl+a'' suivie de ''?''. | 
|  |  | 
| On peut également **c**réer d'autres terminaux virtuels ; quand on est dans screen, faire un ''ctrl+a'' et ''c''. On passe alors de l'un à l'autre avec ''ctrl+a'' et ''n'' (**n**ext) ou encore ''ctrl+a'' et ''p'' (**p**revious). ''ctrl+a'' ''ctrl+a'' permet de revenir à l'ancien terminal virtuel. | Une fois screen lancé, saisir la hotkey ''Ctrl+a'' suivie de : | 
|  |  | 
| On peut aussi partager un terminal : il faut créer un ''screen'', puis quelqu'un d'autre se rattache dessus avec un ''screen -x''. | * ''c'' : pour **c**réer une nouvelle fenêtre (nouveau terminal) | 
| On utilise cette fonctionnalité avec un utilisateur distant connecté en SSH par exemple. | * ''k'': **k**iller le terminal courant (une confirmation vous est demandée (y/n)) | 
|  | * ''n'' (**n**ext) : se déplacer vers le terminal suivant | 
|  | * ''p'' (**p**revious) : se déplacer vers le terminal précédent | 
|  | * ''<nb>'' : se déplacer vers le terminal <nb>,  avec <nb> son numéro (0, 1, ...) | 
|  | * ''"'' : voir la liste des terminaux ouverts | 
|  | * ''ctrl+a'' : sélectionner la dernière fenêtre consultée | 
|  | * ''Ctrl+<space>'' : sélectionner la prochaine fenêtre | 
|  | * ''A'' : pour renommer le titre du terminal courant | 
|  | * ''ctrl+x'' : verrouiller la session screen. En fonction de votre implémentation de screen : | 
|  | * soit le mdp de votre utilisateur vous sera demandé pour rouvrir la session (e.g. sous Debian); | 
|  | * soit il demande un mdp avant de la verrouiller, qu'il faudra redonner pour la rouvrir (e.g. sous macOSX) | 
|  | * ''F'' : rafraîchir la fenêtre | 
|  | * '':'' : permet d'afficher le prompt pour passer en mode commande | 
|  |  | 
| On peut lancer plusieurs screen à la fois ; pour se rattacher à l'un d'entre eux on utilise la syntaxe : |  | 
|  |  | 
| screen -r | =====Diviser la fenêtre (split)===== | 
| There are several suitable screens on: |  | 
| 314..soekris-01 (Detached) |  | 
| 9364..soekris-01        (Detached) |  | 
| Type "screen [-d] -r [pid.]tty.host" to resume one of them. |  | 
| screen -r 314..soekris-01 |  | 
|  |  | 
| Pour lancer un script dans un screen au démarrage par exemple, on utilise : | Plutôt que d'avoir un terminal par écran, on peut agencer l'affichage des terminaux en divisant l'écran en panneaux/régions, pour en afficher plusieurs ; mais tous les terminaux sont accessibles dans chaque panneau. | 
|  |  | 
|  | Pour diviser la fenêtre : ''Ctrl+a'' suivi de : | 
|  | * ''S'' pour diviser l'écran horizontalement | 
|  | * ''|'' pour diviser l'écran verticalement | 
|  |  | 
|  | Autres raccourcis liés au split : | 
|  | * ''X'' : fermer le panneau courant | 
|  | * ''Q'' : supprimer tous les panneaux sauf celui sélectionné | 
|  | * ''F'' : redimensionner la fenêtre sur la taille du panneau sélectionné | 
|  | * ''<tab>'' sélectionner le prochain panneau | 
|  | Il n'existe pas d'inverse du ''Ctrl-a <tab>'' (sélectionner le précédent panneau). Par contre il est possible de créer des raccourcis pour sélectionner le panneau du haut/bas : pour cela il faut éditer le fichier **~/.screenrc** et ajouter ces lignes : | 
|  | <code bash> | 
|  | bind k focus down | 
|  | bind j focus up | 
|  | bind t focus top | 
|  | bind b focus bottom | 
|  | </code> | 
|  |  | 
|  | =====Configuration===== | 
|  |  | 
|  | Le fichier de configuration général se nomme se trouve dans ''/etc/screenrc'', mais chaque utilisateur peut la surcharger dans son fichier ''~/.screenrc''. | 
|  |  | 
|  | Lorsqu'un screen est lancé et que l'on veut recharger le fichier de configuration (pour prendre en compte une modif par exemple), faire ''Ctrl-a'' puis saisir : '':source ~/.screenrc''. | 
|  |  | 
|  |  | 
|  | =====Tips===== | 
|  |  | 
|  | ====Copier le buffer dans un fichier==== | 
|  |  | 
|  | Pour enregistrer le buffer screen dans un fichier texte, il suffit de saisir ''Ctrl+a :'' pour passer en mode commande, puis ''hardcopy -h <fichier.txt>''. | 
|  |  | 
|  | Une autre méthode, plus compliquée mais qui permet de comprendre le mécanisme de copies de screen : | 
|  | - Passer en mode scrollback buffer : ''Ctrl+a ['' (ou ''Esc'') | 
|  | - Sélectionner le texte à copier ; pour copier l'intégralité du buffer : ''g'' (aller en début du buffer), ''espace'' (marquer le début de la sélection), ''G'' (aller à la fin du buffer), ''<enter>'' (marquer la fin de la sélection) | 
|  | - Lancer un éditeur de texte, par exemple vi (pour éviter les problèmes d'indentation, penser à passer en mode "paste": '':set paste'' | 
|  | - Coller le buffer : ''Ctrl+a ]'' | 
|  |  | 
|  |  | 
|  | =====Annexes===== | 
|  |  | 
| screen -d -m script.sh | ====Exemple de template de conf==== | 
|  |  | 
| pour créer une nouvelle session sans l'attacher. | <code bash> | 
|  | # ne pas afficher le message au lancement | 
|  | startup_message off | 
|  | deflogin on | 
|  | vbell on | 
|  | vbell_msg "   Wuff  ----  Wuff!!  " | 
|  | defscrollback 1024 | 
|  | bind ^k | 
|  | bind ^\ | 
|  | bind \\ quit | 
|  | bind K kill | 
|  | bind I login on | 
|  | bind O login off | 
|  | bind } history | 
|  | termcapinfo vt100 dl=5\E[M | 
|  | hardstatus off | 
|  | termcapinfo xterm*|rxvt*|kterm*|Eterm* hs:ts=\E]0;:fs=\007:ds=\E]0;\007 | 
|  | # Pour afficher une barre de statut : | 
|  | #hardstatus alwayslastline "%d/%m/%Y [%c] | %w" | 
|  | # ou | 
|  | hardstatus alwayslastline "%-w%{.BW}%n %t%{-}%+w %= %l | %d/%m/%y %c" | 
|  | termcapinfo xterm*|linux*|rxvt*|Eterm* OP | 
|  | termcapinfo xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l' | 
|  |  | 
|  | # ~/.screenrc | 
|  | defscrollback 4096 | 
|  | startup_message off | 
|  | caption always "%{bw}%H%{g} |%c %{y}%d.%m.%Y%{k} | %?%-Lw%?%{+b wk}%n*%f %t%?(%u)%?%{-b kw}%?%+Lw%? | %{-b rw} Load: %l %{k}" | 
|  | </code> |