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 :-)
|