System-Linux

Aller au contenu | Aller au menu | Aller à la recherche

Invoquer un programme en tâche de fond, magique !

shell.png

Astuce qui vaut vraiment le détour !

Invoquer un programme en tâche de fond :

Certains programmes ne rendent pas la main (ouuuuhh c'est null) immédiatement (exemple : la compilation, script lourd etc...).

Pour récupérer la main, il suffit de rajouter un & (ET commercial) à la fin de votre commande :

$ commande farfelu -grr &

Si on a lancé une commande qui ne rend pas la main et que l'on a oublié de rajouter le &, on peut utiliser la méthode suivante :

$ commande-farfelu -grr
 <CTRL Z>
 [1]+  Stopped                 commande-farfelu

Le programme est alors stoppé. Il suffit de taper ensuite la commande bg (background) pour qu'il s'éxécute en tâche de fond :

 $ commande-farfelu -grr
 <CTRL Z>
 [1]+  Stopped                 commande-farfelu
 $ bg
 [1]+ commande-farfelu &
 $

La commande fg (foreground) permet de refaire passer le programme au premier plan :

 $ commande-farfelu
 <CTRL Z>
 [1]+  Stopped                 commande farfelu
 $ bg
 [1]+ commande farfelu &
 $ fg
 commande farfelu

La commande jobs affiche les tâches en cours :

 $ jobs
[1]+  Running                 commande farfelu &

Voila :) ça vous a plu ?

Par GanGan | le jeudi, mai 28 2009 08:00

Commentaires

1. Fred

jeudi, mai 28 2009 | 10:30

2 précisions :
- l'execution d'un processus en tâche de fond (background) ne le détache pas de ses entrées sorties standard. Deux conséquences à ça : une commande comme
tail -f /var/log/messages &
va rendre la main immédiatement mais l'affichage de la commande tail va continuer en mettant un sacré bazar à l'écran ;) La seconde c'est que le processus en tâche de fond va s'arreter si on "exit" le shell père (puisque le shell fork un fils pour éxécuter une commande)
- chaque job est numéroté et fg et bg prennent un argument optionnel qui est le numero de job
ex:bg 4
fg 2

2. nico128

jeudi, mai 28 2009 | 21:56

en fait, pour éviter ces 2 problèmes, il existe 2 solutions.
1 - pour éviter l'affichage intempestif il faut rediriger la sortie standard ainsi que la sortie ERREUR vers /dev/null si l'on se fiche du résultat, ou vers un fichier log que l'on peux consulter ensuite:
$ commande-qui-affiche-trop-de-trucs-inutiles >/dev/null 2>/dev/null &
ou encore
$ commande-qui-affiche-trop-de-trucs-mais-utiles > mon-fichier-log.log 2>mon-fichier-erreur.log &

2 - pour lancer le script sans le lier au shell d'origine :
$ nohup commande-qui-affiche &

3. sebx[fr]

jeudi, mai 28 2009 | 21:59

Peut etre faire un article sur screen !

4. GanGan

vendredi, mai 29 2009 | 09:20

ça va venir :)

5. Kévin Hinault

vendredi, mai 29 2009 | 09:42

Snif j'ai plus rien a dire là :'(

6. Fred

vendredi, mai 29 2009 | 10:35

Effectivement perso j'utilise beaucoup screen :
- pour pas perdre mon environnement lors de coupures réseau
- pour lancer des traitements sans les mettre en tâche de fond pour mieux les suivre
- globalement c'est très pratique quand on fait quelque chose d'un coté et qu'on a un tail -f sur les log sur un deuxième shell de screen ;-)

J'avais écrit un article qui décrit le B.A-B.A. de l'utilisation de screen qui pourrait te servir de point de départ : http://frederic.ple.name/index.php/...

7. Fred

vendredi, mai 29 2009 | 10:36

au fait, qu est ce qui me vaut un avatar aussi horrible sur mon premier commentaire :-D ?

8. gangan

vendredi, mai 29 2009 | 11:01

je sais pas j'ai pas saisie comment ça fonctionne ces avatars, faut que Kévin fasse un tuto lolll

9. Kévin Hinault

vendredi, mai 29 2009 | 11:18

L'idéal serait que tu mettes en place des gravatars ^^