Sites


Introduction à la ligne de commande

CommandLineIntro: Processes

Les processus

Un processus est un programme qui tourne. Les programmes sous forme binaire exécutable se trouvent sur votre disque dur ; lorsqu'ils sont exécutés (démarrés), ils sont chargés en mémoire et deviennent des processus. À tout programme que nous démarrons correspond (au moins) un processus.

Interrompre un processus (CTRL-C)

Le noyau envoie des signaux aux processus pour plusieurs raisons. Le signal SIGINT est envoyé lorsque l'utilisateur presse la combinaison de touches <ctrl><C>. Ce signal est envoyé au processus qui tourne à l'avant-plan du terminal actif.  Si ce processus n'a pas défini une réponse à SIGINT (on dit qu'il attrape SIGINT), il sera terminé immédiatement avec une possible perte de donnée (les fichiers ouverts seront néanmoins fermés).  Certains programmes attrapent SIGINT et l'utilise dans un but spécifique. Par l'exemple, l'éditeur nano y répond en affichant la position courante dans le fichier qui est en train d'être édité.

ps et kill

Les commandes ps et top peuvent être utilisées pour voir les processus en train de tourner sur notre machine.

La commande command, exécutée sans argument, affiche les processus lancés par l'utilisateur courant.

$ ps
 PID TTY          TIME CMD
3922 tty2     00:00:00 su
3923 tty2     00:00:00 sh
3941 pts/0    00:00:00 cat
3942 pts/0    00:00:00 ps

Nous voyons ici qu'il y a 4 processus démarrés à partir de notre terminal. Les 4 colonnes sont interprétées de la manière suivante :

Process ID   Terminal   CPU Time   Program/Command 

Chaque processus a un identifiant que le système d'exploitation utilise pour le gérer.  C'est un nombre entier qui est associé à chaque nouveau processus, et qui est appelé PID (pour "process ID"). L'écart entre le PID 3923 et le PID 3941 de cat indique simplement que quelqu'un a démarré d'autres processus entre le lancement de ces deux processus.

La deuxième colonne liste le terminal auquel le processus est attaché ou le terminal qui contrôle le processus.  Vous pouvez utiliser la commande tty pour savoir dans quel terminal vous introduisez vos commandes.

$ tty
/dev/tty2

Vous pouvez vous attendre à ce que votre machine tourne bien plus de processus que ceux qui sont listés lorsque vous lancez simplement la commande ps sans arguments. En effet, dans ce cas, la liste ne comprend que les processus qui ont été lancé depuis le terminal dans lequel ps a été exécuté. Dans un environnement graphique, cette commande ne liste pas les programmes démarrer à partir des menus ou en cliquant sur des icônes. Le système tourne également de nombreux processus en arrière plan. Pour voir tous les processus, ajoutez l'option -e :

$ ps -e
 PID TTY          TIME CMD
   1 ?        00:00:01 init
   2 ?        00:00:00 kthreadd
   3 ?        00:00:00 migration/0
   4 ?        00:00:00 ksoftirqd/0
   5 ?        00:00:00 watchdog/0
   6 ?        00:00:00 migration/1
   7 ?        00:00:00 ksoftirqd/1
   8 ?        00:00:00 watchdog/1
   9 ?        00:00:00 events/0
  10 ?        00:00:00 events/1
  11 ?        00:00:00 khelper
  44 ?        00:00:00 kblockd/0
  45 ?        00:00:00 kblockd/1
.........................................
.........................................
3534 tty1     00:00:00 getty
3535 tty2     00:00:00 login
3536 tty3     00:00:00 getty
3537 tty4     00:00:00 getty
3538 tty5     00:00:00 getty
3539 tty6     00:00:00 getty

Si vous voulez terminer un processus que vous avez lancé, vous pouvez le faire en utilisant la commande kill.

$ kill 3941

Dans ce cas, le PID du processus à terminer est passé en argument. Souvenez-vous que la commande kill n'est pas, par défaut, interactive (aucune confirmation ne sera demandée avant exécution) et ni verbeuse/loquace (la commande ne vous dit pas ce qu'elle fait), elle doit donc être utilisée avec prudence.  Vous ne pouvez tuer que vos propres processus.  De plus, si un programme est vraiment mort, il ne répondre à la commande; dans ce cas, on utilisera l'option -9. C'est le numéro du signal SIGKILL, et, si vous êtes vraiment prudent, vous utiliserez la commande "kill -s SIGKILL (pid)" car il est possible que sur votre système, les numéros de signaux soient alloués différemment.

Processus et tâches (en arrière plan)

Si vous désirez exécuter un programme en arrière plan et pouvoir introduire d'autres commandes dans le terminal,  il suffit de placer une esperluette ("&") après la commande.

$ firefox &
[1] 3694
$

Le shell affiche un bref message et retourne à l'invite (le signe dollar). Firefox est lancé  (et devrait ouvrir une fenêtre, comme c'est une application graphique). Vous pouvez exécuter d'autres commandes dans le terminal.

Que signifient les deux nombres affichés après que le programme ait été mis en arrière plan? Le nombre entre crochets est un identifiant spécial assigné à chaque programme que vous lancez en arrière plan; il est appelé job number (numéro de tâche). Dans le cas qui nous occupe, le nombre est 1 parce que nous n'avons aucun autre programme tournant en arrière plan dans ce shell.

Le second nombre, 3694 ici, est le numéro de processus dont nous avons parlé plus haut dans une section précédente. 

Pour faire revenir votre programme à l'avant plan, il suffit de taper fg. Le programme prend alors le contrôle de votre terminal tout comme un programme normal et ce jusqu'à ce qu'il finisse.

Si vous avez plusieurs programmes en arrière plan, vous pouvez indiquer à la commande fg soit le numéro de processus :

$ fg 3694
ou le numéro de tâche :
$ fg %1

Pour faire la différence entre les deux, vous devez mettre un signe pour-cent ("%") devant le numéro de tâche.

Si vous voulez mettre en arrière plan un programme qui est en train de tourner à l'avant plan, tapez d'abord Ctrl + Z, pour suspendre le programme et puis utiliser la commande  bg pour relancer son exécution à l'arrière plan.

Pour connaître la liste de tâches qui tournent en arrière plan (et leur état), utilisez la commande jobs:

$ jobs
[1]-  Running                 firefox &
[2]+  Exit 2                  sort > big_file_sorted 2> big_file_err
Firefox est toujours en train de tourner, mais la seconde tâche s'est terminé avec un état d'erreur numéro 2.

Il y a une erreur de communication avec le serveur Booktype. Nous ne savons pas actuellement où est le problème.

Vous devriez rafraîchir la page.