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 :
Dans ce "sur-bash", je lance vi toto.txt
Ensuite, je coupe avec Ctrl-a d
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
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 !