Précédent | Contenu | Suivant
Dans la leçon précédente, nous avons examiné certaines des implications de Linux en tant que système d’exploitation multi-utilisateurs. Dans cette leçon, nous examinerons la nature multitâche de Linux, et comment elle est contrôlée avec l’interface de ligne de commande.
Comme tout système d’exploitation multitâche, Linux exécute plusieurs processus simultanés. Ils semblent simultanés, en tout cas. En fait, un seul cœur de processeur ne peut exécuter qu’un seul processus à la fois, mais le noyau Linux parvient à donner à chaque processus son tour au processeur et chacun semble s’exécuter en même temps.
Il existe plusieurs commandes qui sont utilisées pour contrôler les processus. Elles sont :
-
ps
– lister les processus en cours d’exécution sur le système -
kill
– envoyer un signal à un ou plusieurs processus (généralement pour « tuer » un processus) -
jobs
– un moyen alternatif de lister vos propres processus -
bg
-. mettre un processus en arrière-plan -
fg
– mettre un processus en avant-plan
Un exemple pratique
Bien qu’il puisse sembler que ce sujet soit plutôt obscur, il peut être trèspratique pour l’utilisateur moyen qui travaille principalement avec l’interface utilisateur graphique. Bien que cela puisse ne pas être apparent, la plupart (sinon tous) des programmes graphiques peuvent être lancés à partir de la ligne de commande. Voici un exemple : il existe un petit programme fourni avec le système X Window appelé xload qui affiche un graphique représentant la charge du système. Nous pouvons exécuter ce programme en tapant ce qui suit:
xload
Notez que la petite fenêtre xload
apparaît et commence à afficher le graphique de la charge du système. Sur les systèmes où xload
n’est pas disponible, essayez gedit
à la place. Remarquez également que notre invite n’est pas réapparue après le lancement du programme. L’interpréteur de commandes attend que le programme se termine avant de reprendre le contrôle. Si nous fermons la fenêtre xload
, le programme xload se termine et l’invite revient.
Mettre un programme en arrière-plan
Maintenant, pour nous faciliter un peu la vie, nous allons lancer à nouveau le programme xload, mais cette fois-ci nous le mettrons en arrière-plan pour que l’invite revienne. Pour ce faire, nous exécutons xload comme ceci:
xload &
1223$Dans ce cas, l’invite est revenue parce que le processus a été mis en arrière-plan.
Mais imaginez que nous avons oublié d’utiliser le symbole « & » pour mettre le programme en arrière-plan. Il y a encore de l’espoir. Nous pouvons taper Ctrl-z
et leprocessus sera suspendu. Nous pouvons le vérifier en voyant que la fenêtre du programme est gelée. Le processus existe toujours, mais il est inactif. Pour reprendre le processus en arrière-plan, on tape la commande bg
(abréviation debackground). Voici un exemple:
xload
+ Stopped xload$ bg
+ xload &Lister les processus en cours
Maintenant que nous avons un processus en arrière-plan, il serait utile d’afficherune liste des processus que nous avons lancés. Pour ce faire, nous pouvons utiliser la commandejobs
ou la commande ps, plus puissante.
jobs
+ Running xload&$ ps
PID TTY TIME CMD1211 pts/4 00:00:00 bash1246 pts/4 00:00:00 xload1247 pts/4 00:00:00 ps$Killing a Process
Supposons que nous ayons un programme qui ne répond plus ; comment nous en débarrasser ? Nous utilisons la commande kill
, bien sûr. Essayons-la sur xload
. D’abord, nous devons identifier le processus que nous voulons tuer. Nous pouvons utiliser soit jobs
soitps
, pour le faire. Si nous utilisons jobs, nous obtiendrons en retour un numéro de job. Avec ps
, on nous donne un identifiant de processus (PID). Nous allons le faire bothways:
xload &
1292$ jobs
+ Running xload&$ kill %1
$ xload &
1293 Terminated xload$ ps
PID TTY TIME CMD1280 pts/5 00:00:00 bash1293 pts/5 00:00:00 xload1294 pts/5 00 :00:00 ps$ kill 1293
+ Terminated xload$Un peu plus sur kill
Bien que la commande kill
soit utilisée pour « tuer » des processus, son but réel est d’envoyer des signaux aux processus. La plupart du temps, le signal est destiné à dire au processus de s’en aller, mais il y a plus que cela. Les programmes (s’ils sont correctement écrits) écoutent les signaux du système d’exploitation et y répondent, le plus souvent pour permettre une méthode de terminaison gracieuse. Par exemple, un éditeur de texte peut écouter tout signal indiquant que l’utilisateur se déconnecte ou que l’ordinateur s’éteint. Lorsqu’il reçoit ce signal, il peut sauvegarder le travail en cours avant de quitter. La commande kill
peut envoyer une variété de signaux aux processus. En tapant :
kill -l
, vous obtiendrez une liste des signaux qu’elle supporte. Beaucoup sont plutôt obscurs, mais plusieurs sont pratiques à connaître:
Signal # | Nom | Description |
1 | SIGHUP | Signal de raccrochage. Les programmes peuvent écouter ce signal et agir en conséquence. Ce signal est envoyé aux processus en cours d’exécution dans un terminal lorsque vous fermez le terminal. |
2 | SIGINT | Signal d’interruption. Ce signal est donné aux processus pour les interrompre. Les programmes peuvent traiter ce signal et agir en conséquence. On peut aussi émettre ce signal directement en tapant Ctrl-c dans la fenêtre du terminal où s’exécute le programme. |
15 | SIGTERM | Signal de terminaison. Ce signal est donné aux processus pour les terminer. Là encore, les programmes peuvent traiter ce signal et agir en conséquence. C’est le signal par défaut envoyé par la commande kill si aucun signal n’est spécifié. |
9 | SIGKILL | Signal de mort. Ce signal provoque la terminaison immédiate du processus par le noyau Linux. Les programmes ne peuvent pas écouter ce signal. |
Supposons maintenant que nous avons un programme qui est désespérément accroché et que nous voulons nous en débarrasser. Voici ce que nous faisons :
- Utiliser la commande
ps
pour obtenir l’id de processus (PID) du processus que nous voulons terminer. - Envoyer une commande
kill
pour ce PID. - Si le processus refuse de se terminer (c’est-à-dire, il ignore le signal), envoyez des signaux de plus en plus durs jusqu’à ce qu’il se termine.
ps x | grep bad_program
PID TTY STAT TIME COMMAND2931 pts/5 SN 0:00 bad_program$ kill -SIGTERM 2931
$ kill -SIGKILL 2931
Dans l’exemple ci-dessus, nous avons utilisé la commande ps
avec l’option x pour lister tous nos processus (même ceux qui ne sont pas lancés depuis le terminal actuel). De plus, nous avons pipé la sortie de la commande ps dans grep
pour ne lister que le programme qui nous intéresse. Ensuite, nous avons utilisé kill pour émettre un signal SIGTERM au programme gênant.Dans la pratique réelle, il est plus courant de le faire de la manière suivante puisque le signal par défaut envoyé par kill
est SIGTERM et que kill peut aussi utiliser le numéro du signal au lieu de son nom:
kill 2931
Puis, si le processus ne se termine pas, forcez-le avec le signal SIGKILL:
kill -9 2931
C’est tout !
Ceci conclut la série de leçons « Apprendre le Shell ». Dans la prochaine série, « Écrire des scripts shell », nous verrons comment automatiser des tâches avec le shell.
Lectures complémentaires
- Pour un traitement plus approfondi du sujet, voir le chapitre 10 dans La ligne de commande Linux.
- 1963 Partage du temps : A Solution to Computer Bottlenecks, une fascinante vidéo YouTube du Computer History Museum décrivant le premier système d’exploitation à temps partagé et son fonctionnement. C’est essentiellement la même méthode utilisée par tous les ordinateurs modernes.