Révision : 01/08/00
 
  Introduction  
 
Un remerciement à Lenny Cartier pour avoir rédigé cette documentation sur la fonction multi-tâches de Linux. Les quelques modifications (corrections mineures, opt copies d'écran, màj des liens) ont été faites en accord avec son auteur. Les commandes nommées dans cette fiche ont été utilisées sur un PowerMac 7500 et une distribution LinuxPPC 1999.

Le multi-tâches sous Linux, c'est un pléonasme. Le multi-tâches sous Linux est loin d'étre une nouveauté, les systèmes inspirés d' Unix ont fait force d'implanter un multi-tâche performant ainsi que des outils de gestion puissants. 
Ainsi si vous lancez un programme en tâche de fond vous pouvez le paramétrer, et ce à chaque instant, et lui accorder plus ou moins de ressources système selon ce que vous voulez faire pendant ce temps là. Je pense que prendre l'exemple de l'utilisation de Seti@home en tâche de fond sera un bon exemple. 
Nous verrons comment placer une application en tâche de fond, gerer ses ressources, tuer le processus... Bref, vous allez constater que lorsque l'on vous dit que Windows est multi-tâche c'est de la franche rigolade !!!

 
 
 
 
Passer un programme en tâche de fond

Les programmes lancés en même temps sont désignés sous Linux par le nom de processus. Plusieurs processus sont déja lancés au démarrage de la machine et restent actifs ou sont mis en sommeil pendant que vous utilisez la machine, tout cela à l'insu de votre plein gré.
Pour faire passer un programme en tâche de fond dès son lancement il faut ajouter le caractère & à la suite du programme, par exemple :

setiathome > /dev/null &

Le système vous renvoie une ligne qui peut ressembler à ceci :

[4] 14550

Le chiffre entre crochet indique le nombre de tâches de fond en cours en ce moment. Le programme Seti@home est donc placé dans le "4ème arrière plan". La seconde série de chiffres est le numéro d'identification de processus, pour arréter autoritairement ce programme par kill.

Vous devez faire attention aux instructions que j'ai placées à la suite de setiathome. Ce programme écrit régulièrement son état sur l'écran et ce même en tâche de fond car passer un programme en tâche de fond revient à récupérer la ligne de commande pour faire autrechose. Donc le programme continue de se servir de l'écran comme si de rien était, c'est pour cela que j'ai renvoyé la sortie sur l'écran vers le périphérique vide (/dev/null) à l'aide du caractère >.

Pour contrôler l'état des programmes présents en arrière plan on utilise la commande ps 

à laquelle on peut ajouter le paramètre -u

pour plus de details. Voici le résultat :

Voici la description des colonnes :
 

  • USER : Ici c'est le propriétaire du processus, en fait la personne qui l'a lancé.
  • PID : Le numéro d'identification du processus qui est automatiquement attribué par Linux. Utile pour certaines actions sur le processus.
  • %CPU : La part de temps de calcul CPU utilisé par ce processus, plus le chiffre est important et plus le processus mobilise la puissance de l'ordinateur.
  • %MEM : Part de la mémoire totale occupée utilisée par le processus, en général pour un multitâches efficace il faut une quantité de mémoire quand même importante surtout si votre machine est utilisée comme serveur.
  • VSZ : non documenté.
  • RSS : Taille résidente de l'image du processus. Nombre de kilo-octets se trouvent en mémoire.
  • TTY : non documenté.
  • STAT : C'est l'état du processus, des explications plus bas...
  • START : Heure à laquelle a été lancé le processus.
  • TIME : Temps réel de calcul accordé à la tâche.
  • COMMAND : La commande lancée pour le processus.


La colonne STAT peut prendre diverses valeurs, en voici la description :

D : Le processus est en état de sommeil qui ne peut étre interrompu.
R : L'exécution est en cours.
S : Comme Sleep, le processus est endormi.
T : Le processu est interrompu.
Z : C'est unn processus fantôme.
Notez que vous pouvez lancer ps avec u comme option et non -u car la communauté Linux fait évoluer le système et la syntaxe en même temps. C'est pour cela que Linux affiche un message qui indique que -u est en passe de devenir obsolète.

Gérer les processus

Maintenant que vous savez placer vos processus en arrière plan il va falloir les gérer, les arréter ou modifier leurs priorités.
La première fonction à connaitre est sans nul doute celle d'arrêt d'un processus. Cette commande s'appelle kill, la syntaxe en est la suivante :

kill [numéro de signal] [pid du processus]

Le numéro de signal peut prendre deux valeurs, celle par défaut est -15, vous n'avez pas besoin de l'entrer car elle est toujours attibuée quand on appelle kill sans paramètre. Ce paramètre -15 demande au programme en arrière plan d'exécuter sa fermeture naturelle, c'est à dire terminer l'opération en cours, fermer ses fichiers correctement... A l'inverse le paramètre -9 force le signal à se terminer immédiatement, c'est le recours ultime si le programme en tâche de fond est en boucle, les fichiers peuvent ne pas avoir étés fermés correctement...bref, c'est une solution brutale.

Le PID du processus est le numéro identifiant le processus dans la deuxième colonne du tableau résultant de la commande ps u.

Deux instructions permettent, elles, de gérer la position des processus qui sont soit au premier ou à l'arrière plan. Ces instructions sont fg (foreground) et bg (background) :

Ainsi si vous avez tapé mkfs -c /dev/fp0 & qui vérifie la présence de mauvais blocs en tâche de fond. Quand vous lancez un processus, il vous est donné un un numéro d'ordre (1,2,3,4,...) ainsi que le PID, cette fois ci c'est le numéro d'ordre dont vous aurez besoin vous pouvez ramener ce processus à l'avant plan par :

fg [numéro d'ordre]

Ceci activera mkfs à l'avant plan et vous devrez attendre la fin de son exécution pour récupérer la main. Cet outil est pratique lorsque par mégarde vous avez mis en tâche de fond un programme dans lequel vous deviez faire des choix ou répondre à des questions, ainsi vous pouvez le ramener au premier plan.

Il y a peu j'avais mis ici une section provisoire car je cherchais des informations à propos de ces deux commandes, j'ai eu des compléments d'information par un visiteur (qui veut rester anonyme !! je plaisante !!), voici son mail :
 

fg/bg sont les commandes qui permettent de faire passer un programme au premier-plan, ou en arriere-plan.

Ainsi, si tu as lance un programme en arriere-plan (avec le &), tu peux le refaire passer au premier plan avec fg.

fg est assez peu utilise en fait. Il est assez rare d'avoir a refaire passer au premier plan un programme (sauf si c'est un programme qui necessite une interaction avec l'utilisateur, mais dans ce cas, on le lance rarement en tache de fond).
Par contre, bg est plus utilise. Si par exemple tu as lance une grosse compression qui dure longtemps mais que tu as oublie le & pour qu'elle soit en tache de fond, tu peux la stopper avec Control-Z. Ceci gelera le programme (il n'est pas arrete dans le sens "termine", il est seulement dans un etat gele).
Tu retrouveras alors ta ligne de commande. A ce moment là si tu tapes bg, le programme gelé passera en tache de fond. Donc il continuera a tourner, mais tu gardera ta ligne de commande.
Tu peux t'en assurer avec la commande "jobs", qui t'affiche l'etat des processus en arriere-plan.

A l'heure des interfaces graphiques avec plein de fenetres, fg/bg/jobs sont de moins en moins utiles, mais sur une console, c'est très pratique.
Pour illustrer les possibilites de ces commandes, voici un exemple : mettons que tu veuilles éditer un fichier. Tu tapes :

$ vi toto.txt

Tu te retrouves sous vi, et la tu as besoin de lire ton mail. Tu peux alors taper Control-Z dans ta fenetre vi. Ceci va immediatement stopper ton vi et tu vas revenir sur la ligne de commande.

Tu peux ensuite lancer ton lecteur de mail :

$ mailx

Tu es en train de lire tes mails et tu veux retourner a ton fichier toto.txt.
Tu tapes Control-Z dans ton lecteur de mail, et hop ! tu reviens en ligne de commande.
La, si tu tapes "jobs", tu verras :
$ jobs
[1]- Stopped vi toto.txt
[2]+ Stopped mailx
Tu peux relancer l'un ou l'autre de ces deux programmes avec fg suivi du numero de job de la commande (sachant que "fg" tout court lance le 1).
Ainsi :
$ fg 1
Te remets sous vi, et dans l'etat dans lequel tu l'avais laisse. Tu peux refaire des Control-Z a tout moment, et revenir sous mailx ou relancer d'autres programmes.
Comme tu le vois, sur une console, c'est tres puissant. Mais il est vrai que sur un PC moderne, tu peux ouvrir 2 xterm et lancer ton vi et ton mailx dans chacun d'eux.


Faire le gendarme !!

Sous Linux vous pouvez accorder plus ou moins de temps de calcul de l'ordinateur à une application, utile si par exemple vous avez un traitement d'image exigeant en calcul à réaliser rapidement sans pour autant vous empécher de découvrir E.T.
Pour cela il faut accorder des temps de calcul plus réduits au lancement de Seti@home, ceci peut étre fait par l'instruction nice : 

nice -n [niveau] [commande] 

Le niveau est un chiffre compris entre -20 et +19 (les niveau infèrieurs à 0 sont réservés à root), plus le chiffre est bas plus le programme concerné aura de temps de calcul, cela au détriment des autres programmes. A l'inverse si vous jugez qu'un programme à besoin de moins de puissance par rapport aux autres, rien ne vous empêche de lui accorder un chiffre plus élevé. Si vous lancez nice sans niveau particulier c'est la valeur +10 qui est utilisée par défaut.

nice -n -20 setiathome > /dev/null &

Permet d'accorder à Seti@home le maximum de ressources tout en le plaçant à l'arrière plan. En principe vous devriez percevoir un ralentissement de votre système, les ressources étant allouée à un seul programme. Si, par hasard, je désire appliquer un filtre compliqué dans GIMP, je peux modifier ces priorités par :

renice +10 -p 664

Ici le processus 664 (admettons que c'est le PID de Seti@home) voit sa priorité fixée à 10 et ce sans interrompre son fonctionnement, bien sur vous pouvez descendre les priorités en négatif.

Vous voila maitre dans l'art du multi-tâches, sèrieusement...vous pouvez constater que sous Linux le contrôle est beaucoup plus fin et puissant que sous Windows. Quand Microsoft nous fera la même chose il pourra nous vendre son produit sans tâches :-) 


 
 
 
Pour ajouter à ce site vos propres expériences et
autres renseignements, écrivez à son Auteur Web