Screen, le meilleur ami du geek nomade

Lun 11 avril 2005

[via IRC (merci - t'ain j'me rappelle plus qui... davee ? fuzzix ?)]
Je cherchais un moyen sous bash de lancer un programme, le couper (ou le mettre en sommeil), puis de le récupérer pour le relancer... sur un autre bash.

Jobs

Les premières étapes sont relativement connues. Ce qui vient en italique l'est beaucoup moins.
Pour "stopper" un processus, c'est connu, il faut faire Ctrl-Z. Le programme en cours est "gelé".
Exemple :
$ vi toto.txt[blablabla... je te passe les détails... toujours est-il qu'on fait Ctrl-Z][1]+ Stopped vi toto.txt

On peut continuer à bosser dans ce terminal, le processus gelé reste bloqué en attendant soit de mourir (tué par un logout de la console, ou par la commande kill), soit d'être réactivé.
En l'occurrence, dans la liste des processus suspendus, monsieur vi a le numéro 1. Donc, pour le réactiver, c'est fastoche :
$ %1
et toc toc badaboum, vi est de retour.

Ubiquïté limitée

Une des contrainte de la petite manip avec jobs, c'est qu'il ne peut manipuler que les processus dans la console "mère" du processus.
Imagine que j'ai gêlé un processus dans la console n°1 :
$ jobs[1]+ Stopped vi toto.txt

Par contre, dans la n°2
$ jobs$
Balpeau.
Le système jobs ne peut contrôler (réactiver) que les processus dont le bash est père, pas les autres. Par contre, il peut les zigouiller sans problème :
$ ps PID TTY TIME CMD30600 pts/1 00:00:00 bash30606 pts/1 00:00:00 vi31124 pts/1 00:00:00 ps$ kill -9 30606[1]+ Processus arrêté vi toto.txt$ ps PID TTY TIME CMD30600 pts/1 00:00:00 bash31144 pts/1 00:00:00 ps
Moi, ça m'arrange pas (cf. le début).

Pleins feux sur screen

La doc me dit :

screen (1) - screen manager with VT100/ANSI terminal emulation
[..]
Screen is a full-screen window manager that multiplexes a physical terminal between several processes (typically interactive shells).

Bleh?
Bon, bref... pour résumer, on peut lancer un screen dans un shell, geler ce screen, et le réactiver dans une autre interface shell. Et ce qui est intéressant, c'est qu'on peut "détacher" le processus screen du shell d'origine, alors qu'il peut avoir une bonne tralée de processus encore actifs dans le cornet.
Ca, c'est pile-poil ce qu'il me faut !

Je lance screen :
ecran de lancement de
screen

Dans ce "sur-bash", je lance vi toto.txt
un vi qui dit rien d'autre que
bonjour

Ensuite, je coupe avec Ctrl-a d
l'écran est
détaché
Maintenant, je peux quitter ce bash, faire ce que je veux, l'écran est sauvegardé. Y compris le fait que j'étais dans vi, en fait.
Ensuite, j'ouvre une deuxième console, dans laquelle je lance la simple commande
$ screen -r
de retour dans
vi
Maintenant, je suis de retour dans vi, comme si j'avais réactivé le processus gelé.

Hé hé... J'ai encore quelques tests à faire, y compris répondre à une question cruciale : est-ce que l'écran que j'ai détaché est encore vivant ou les processus sont-ils gelés ? Par exemple : si je détache un écran, est-ce que le programme lancé continue à tourner en mon absence. Je dis ça, euh... si je voulais pas louper les conversations d'un chanel IRC, par exemple...

[Mise à jour - 2005-04-11@23:25] : J'ai vérifié. Les processus sont mis en arrière-plan et toujours actifs. Nom de zeus, c'est ex-ac-te-ment ce que je voulais !