Je suis Charlie

Autres trucs

Accueil

Seulement les RFC

Seulement les fiches de lecture

Ève

screen, pour lancer de longs programmes et pouvoir les suivre

Première rédaction de cet article le 18 mai 2008


Sur une machine Unix, on a souvent envie de lancer des programmes qui durent longtemps, parfois des jours ou des semaines, et qu'on souhaite regarder de temps en temps, sans pour autant bloquer un terminal (d'autant plus qu'on travaille depuis différents postes). screen est un outil assez peu connu pour assurer cette tâche. Il permet de suivre un programme en cours d'exécution, puis de se détacher de lui tout en le laissant tourner et de se rattacher ensuite à volonté.

Si le programme est prévu pour tourner sans surveillance, directe, si c'est un démon, screen n'est pas nécessaire. Mais si on lance une grosse compilation sur sa machine Gentoo ou FreeBSD ? Si on a lancé un client BitTorrent pour télécharger des fichiers et qu'on veut voir de temps en temps où il en est ? Si c'est sur la machine de son bureau, on peut toujours laisser un xterm ouvert. Mais si c'est sur une machine dédiée hébergée chez OVH ou Slicehost ?

Avec la solution du xterm ouvert, je ne peux pas regarder dans la journée au bureau et le soir à la maison. Même chose avec des trucs comme nohup. Avec screen, par contre, je peux lancer le programme, regarder s'il tourne, me détacher du programme (screen continuera à tourner, même sans terminal, et le programme avec lui) puis plus tard me ré-attacher, depuis une toute autre machine.

Les trois commandes de base avec screen dont donc :

  • screen pour lancer une nouvelle session. On peut aussi taper screen MONPROGRAMME pour lancer le programme immédiatement (screen se terminera lorsque le programme MONPROGRAMME se terminera).
  • Control-a d (par défaut, mais c'est modifiable) pour se détacher.
  • screen -r pour reprendre une session en cours.

Personnellement, j'utilise aussi beaucoup l'option -S qui permet de donner un nom à une session screen. screen -list permet ensuite d'afficher les sessions et screen -r NOMSESSION de reprendre celle désirée :

~ % screen -S toto
[Ici, on fait un Control-a d]
[detached]
~ % screen -list
There are screens on:
        8116.toto       (Detached)
        3509.BitTorrent (Detached)
2 Sockets in /var/run/screen/S-stephane.

(screen permet aussi d'avoir plusieurs fenêtres dans une même session mais je n'utilise pas cette possibilité.)

L'un des intérets de screen est de surveiller des programmes bavards (comme une grosse compilation) et il peut donc être utile de remonter dans les messages précédemment affichés. Control-a <escape> fera passer en mode Copy et on pourra chercher en arrière avec Control-r.

screen peut se configurer, notamment via son fichier ~/.screenrc. Par exemple, certains utilisateurs d'Emacs n'apprécie pas le Control-a qui commence les commandes (dans Emacs, cette séquence permet d'aller au début de la ligne) et le reconfigurent dans .screenrc :

# Control-z, plutôt
escape ^Zz

L'excellent site dotfiles.org a une section sur des exemples de tels fichiers.

Un dernier truc amusant qu'un utilisateur m'a signalé. screen peut aussi s'attacher à un terminal physique et peut donc servir d'émulateur de terminal, de concurrent de minicom. Ici, la machine preston est accessible par une liaison série :

% screen -S preston /dev/ttyS0

NetBSD/sparc64 (preston) (console)

login: 

[Control-A d et on est détaché]

J'ai aussi écrit un article sur screen spécifique à BitTorrent. On peut trouver une excellente introduction à screen http://linuxgazette.net/147/appaiah.html ou une plus courte en http://www.mattcutts.com/blog/a-quick-tutorial-on-screen/ ou bien http://www.redhatmagazine.com/2007/09/27/a-guide-to-gnu-screen/.

Le principal concurrent de screen est tmux. Un tableau des commandes comparées donne une idée des fonctions supplémentaires de tmux (c'est vu par les gens de tmux, attention). Il existe un autre article de comparaison.

Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)

Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)