Les processus sous Unix

Unix est un système multi-tâches, c'est-à-dire qu'il peut exécuter plusieurs programmes à la fois. Un processus est une instance d'un programme en train de s'exécuter, une tâche. Le shell crée un nouveau processus pour exécuter chaque commande.

Mettre un processus en tâche de fond

Si on lance une commande qui prend beaucoup de temps (comme un calcul, ou une nouvelle fenêtre), on peut l'interrompre par Control-C. Ceci interrompt (définitivement) la commande. On peut aussi exécuter une commande en tâche de fond. Le shell rend alors la main avant la fin de la commande. Pour le faire, on ajoute un & à la fin de la commande ; par exemple :

chaland ~ $ cc -o grosprogramme grosfichier.c &

chaland ~ $ xdvi monrapport.dvi &

Dans le premier exemple, on lance le compilateur cc en parallèle avec le shell; dans le second exemple, on met le dvi en tâche de fond, ce qui évite d'avoir à le relancer à chaque modification.

On reprend la main immédiatement, sans attendre la fin de l'exécution de la commande. On peut donc taper d'autres commandes dans le même terminal, pendant que la précédente s'exécute.

background et foreground

Comme on vient de le voir, si vous avez pensé à terminer votre ligne de commande par une esperluette, le programme que vous avez lancé tourne en arrière-plan (background, abrégé en bg).

Si vous avez omis l'esperluette, le programme prend la précédence sur le shell. On dit qu'il tourne au premier plan (foreground, abrégé en fg). Les lignes tapées au clavier sont mémorisées mais ne seront pas exécutées par le shell avant que le programme en cours d'exécution n'ait fini son calcul. Vous pouvez malgré tout faire passer ce programme en tâche de fond, grâce à la manipulation suivante :

chaland ~ $ xdvi rapport.dvi
^Z
zsh: suspended xdvi rapport.dvi
chaland ~ $ bg
[1] + continued xdvi rapport.dvi
chaland ~ $

^Z est un signal intercepté par le shell, qui suspend l'exécution du programme sans détruire le processus correspondant. Les calculs déjà effectués par ce programme ne sont pas perdus. Dans l'exemple précédent, si on demande à un xdvi suspendu de changer de page (SPC), il ne le fera pas, mais il se souviendra de le faire dès qu'il aura à nouveau accès aux ressources de l'ordinateur. À partir de l'état suspendu, on peut faire passer un programme :

Son exécution reprend alors là où on l'avait laissée.

Quand il n'y a qu'un seul programme en arrière-plan dans le terminal courant, on peut le faire passer au premier plan en tapant fg. Cela permet en particulier d'interrompre son exécution grâce à ^C, que la plupart des programmes comprennent.^C n'affecte que l'éventuel unique programme qui tourne au premier plan dans le terminal où il est tapé. Quand il y en a plusieurs, c'est un peu plus compliqué, mais c'est bien sûr possible.

Vous pouvez pratiquer ^C, ^Z, fg, bg de façon visuelle et didactique en lançant la commande

xdaliclock -seconds -geometry 500x100+0+0 -font BUILTIN

et en observant attentivement les secondes (pensez à en laisser quelques-unes s'écouler). Vous remarquerez que ce programme finit la transition en cours avant de se remettre à l'heure.

Résumé :

Voir les processus

La commande ps montre où en sont les tâches de fond :

chaland ~ $ ps
 PID TT STAT TIME COMMAND
 4450 p9 S 0:00 /usr/local/bin/lcsh
 4782 p9 S 0:02 cc -o grosprogramme grosfichier.c
 4841 p9 R 0:00 ps

ps affiche la liste des processus que vous avez lancés :

La commande ps a différentes options, dont les suivantes :

ps agux est en fait souvent utilisé pour avoir des informations sur tout les processus.

La commande top affiche les mêmes informations, mais de façon dynamique : elle indique en fait par ordre décroissant le temps machine des processus, les plus gourmands en premier. C'est rigolo quand la machine rame, et c'est très instructif sur les processus gourmands en ressources... Le logiciel KSysGuard, accessible sous la config KDE par la combinaison de touches ^Esc, fait la même chose que top en mode graphique.

Tuer les procesus

Les programmes ont tous une commande spécifique pour les quitter (q, menu où cliquer, etc). C'est seulement dans le cas où vous ne parvenez pas à les quitter correctement, pour une raison ou une autre, que vous pouvez avoir besoin de tuer le processus.

Avant toute chose, essayez de taper ^C ou ^D. Si cependant ça ne marche pas, utilisez la commande kill (plus le numéro du processus).

chaland ~ $ ps
 PID TT STAT TIME COMMAND
 4450 p9 S 0:00 /usr/local/bin/lcsh
 4782 p9 S 0:02 cc -o grosprogramme grosfichier.c
 4841 p9 R 0:00 ps
chaland ~ $ kill 4782
chaland ~ $ ps
 PID TT STAT TIME COMMAND
 4450 p9 S 0:00 /usr/local/bin/lcsh
 4851 p9 R 0:00 ps

kill -9 tue le processus à tous les coups. Vous ne pouvez tuer que les processus dont vous êtes propriétaire. Il convient de ne l'utiliser que si aucune autre méthode ne marche, car dans ce cas le programme n'a aucun moyen de faire quoi que ce soit avant de mourir.

Contrôle des ressources

La possibilité d'exécuter plusieurs commandes à la fois (et aussi sur plusieurs machines) pose un problème immédiat de coexistence pacifique. Ce n'est pas gentil de lancer tous ses programmes de calcul lourds sur la machine d'un copain et partir en vacances le weekend : il peut arriver (et il est arrivé) qu'il ne puisse même plus se connecter. Voilà quelques outils pour vivre paisiblement :