Screen, le meilleur ami du geek nomade
[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 CMD
30600 pts/1 00:00:00 bash
30606 pts/1 00:00:00 vi
31124 pts/1 00:00:00 ps
$ kill -9 30606
[1]+ Processus arrêté vi toto.txt
$ ps
PID TTY TIME CMD
30600 pts/1 00:00:00 bash
31144 pts/1 00:00:00 ps
Moi, ça m'arrange pas (cf. le début).
Pleins feux sur screen
La doc me dit :Bleh?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).
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 !
12 Avril 2005 - 00:25, par Yannick
A noter le -DR qui semble le meilleur compris pour réattacher..
Très pratique aussi pour avoir plusieurs fenetres sans ouvrir 10 ssh...
12 Avril 2005 - 00:28, par kNo'
héhé... qui a dit "les grands esprits se rencontrent ?"