Gestion des processus

Partie 1 / Chapitre 4 : Gestion des processus

Après avoir compris comment circulent les données (le dataflow), il est temps de s’intéresser aux entités qui manipulent ces données : les processus. Si les fichiers sont les briques de Linux, les processus sont les ouvriers qui les utilisent.

Un processus est tout simplement un programme en cours d’exécution. C’est une instance active, chargée dans la mémoire vive de l’ordinateur (la RAM), et qui consomme des ressources CPU (ou GPU) pour s’exécuter. Linux étant un système multi-tâche et multi-utilisateur, il doit s’assurer de l’isolation de chaque processus : il doit garantir que le navigateur web ne plante pas le serveur de base de données.

Chaque processus possède une carte d’identité unique appelée PID (Process ID). Les processus sont organisés de manière parentale : un processus (le parent) en crée un autre (l’enfant). Bien entendu, un processus se retrouve comme étant le « père de tous les processus » : le processus init (ou systemd).

image

En complément, je vous propose de découvrir quelques commandes utiles, dans la gestion des processus.

Communiquer avec les processus : ps et top

Pour gérer ses ouvriers, il faut d’abord pouvoir les voir. Pour cela, nous avons principalement deux commandes bien utiles :

  • ps (Process Status) : Cette commande fournit un instantané des processus en cours d’exécution. Nous utilisons très souventps aux pour lister absolument tout ce qui tourne sur la machine. La combinaison des paramètres aux permet de disposer d’un affichage propre et lisible du nom du processus, du nom de l’utilisateur et de la consommation de ressources.
  • top et htop fournissent un film en direct.top affiche les processus qui consomment le plus, mis à jour toutes les quelques secondes. Nous préférons souvent htop pour son interface plus visuelle et interactive (à noter qu’il n’est pas toujours disponible).

Communication plus ou moins violente avec kill et killall

On évite de « tuer » sauvagement un processus, on lui envoie un signal. C’est une forme de communication normalisée, qui permet notamment d’être poli. Un signal est une notification logicielle pour demander à un processus de changer d’état.

Les principaux signaux sont les suivants :

  • SIGTERM (15) : C’est le signal d’extinction polie (« S’il te plaît, termine ton travail et ferme-toi proprement. ») Il est utilisé par défaut pour l’interruption propre du processus.
  • SIGKILL (9) : C’est l’arrêt immédiat, sans prendre des gants. Le processus n’a pas son mot à dire, il est supprimé de la RAM. De fait, il faut l’utiliser avec modération et en dernier recours, car un processus terminé de cette façon risque d’avoir un peu de mal à redémarrer : par exemple, s’il est interrompu en pleine sauvegarde de données, il risque de ne pas être en mesure de les récupérer, et donc de retrouver son état avant arrêt.
  • SIGHUP (1) : « Recharge ta configuration. » Ce signal est souvent utilisé pour les serveurs sans les redémarrer, lorsqu’une modification a été apportée en configuration.

Les nombres le laissent entendre, il en existe de nombreux autres qui peuvent être employés pour communiquer avec le processus.

Pour envoyer des signaux aux processus, il existe deux commandes en particulier :

  • kill 1234 : Envoie un SIGTERM au PID 1234.
  • kill -9 1234 : Force l’arrêt du PID 1234 avec SIGKILL. Si on utilise -15 au lieu de -9, on reproduit le comportement par défaut de kill.
  • killall firefox : Envoie un signal à tous les processus nommés “firefox”. Pratique pour ne pas chercher le PID. Bien évidemment, tuer le bon processus implique de bien connaître son nom, d’où l’importance d’utiliser ps aux(vous pouvez tester la combinaison avec grep via un pipe pour retrouver vos processus avec un fragment du nom).

Tâches en arrière-plan (Background)

Parfois, une commande prend du temps (une sauvegarde, un calcul lourd) et bloque notre terminal. Pour libérer notre invite de commande tout en laissant le travail continuer, nous disposons de plusieurs commandes permettant de placer cette tâche en arrière plan, tout en gardant la main dessus.

  • En plaçant & à la fin d’une commande, le terminal la lance directement en arrière-plan. Par exemple :cp -r gros_dossier backup/ &.
  • Ctrl + Z permet de mettre en pause (suspend) le processus actuel.
  • jobs liste les tâches en cours dans votre session shell actuelle.
  • bg (background) relance une tâche suspendue en arrière-plan.
  • fg (foreground) ramène une tâche au premier plan pour interagir avec elle.
  • nohup permet à un processus de continuer de tourner même si nous fermons notre terminal. En effet, lorsqu’il se ferme, le terminal envoie un signal à tous les processus en cours d’exécution pour les interrompre. Nohup permet ainsi de contourner ce comportement.

image

Par exemple, il m’est déjà arrivé de lancer tail -f /var/logs/myjob.log & pour avoir les logs en arrière-plan, et de lancer une commande (ou un signal) à mon job, pour voir en direct les logs du traitement de ma commande.

Sous-shells : L’isolation temporaire

Bash propose plusieurs syntaxes permettant l’exécution de commandes dans une instance séparée et temporaire du shell :

  • (...) : L’isolation. Les commandes à l’intérieur n’affectent pas notre shell actuel. Si nous exécutons (cd /tmp && ls), nous verrons le contenu de /tmp, mais nous resterons dans notre dossier actuel après la commande. Ce peut être très utile quand nous avons besoin de réaliser une série d’opérations dans un dossier, depuis un script : l’utilisateur du script retrouve le dossier depuis lequel il a exécuté le script à la fin de son exécution.
  • $(...) : La substitution consiste à exécuter une commande et injecter son résultat dans une autre.* *On l’utilise souvent au sein d’une chaîne de caractères, comme dans l’exemple suivant : echo "Nous sommes le $(date)". À noter que c’est la syntaxe moderne et recommandée par rapport aux anciens « backticks » ... qui furent très utilisés, mais qui souffrent du manque de lisibilité.

Persistance et multi-fenêtrage : Screen et Tmux

Ces outils permettent d’aller beaucoup plus loin que les sous-shells : Si vous travaillez à distance (par exemple avec SSH, ce qui arrive souvent, pour administrer un serveur), une coupure internet tuera votre session et vos processus en cours. Screen et Tmux, les multiplexeurs, sont alors la solution : ils permettent de garder une session ouverte indéfiniment, même après déconnexion. Ils offrent aussi quelques fonctionnalités sympathiques, comme la possibilité de diviser son écran en plusieurs terminaux.

  • Screen est le grand ancêtre. Présent de partout et robuste, il est néanmoins limité en termes de personnalisation et de gestion des fenêtres.
  • Tmux est devenu le standard moderne. Plus puissant, il permet de diviser l’écran (split) verticalement et horizontalement. Il est également très scriptable, pour personnaliser son comportement, la gestion des sessions, etc.

Exemple d’usage de Tmux :

  1. On exécutetmux depuis notre machine pour entrer dans une session.
  2. Nous pouvons ensuite lancer un script long ou quelques applications dont le traitement va durer longtemps.
  3. « Ctrl+B », puis « D » nous permet de nous « détacher ». Le script continue alors de tourner dans la session.
  4. Pour revenir à notre session, nous pouvons exécutertmux attach : Nous retrouvons alors notre écran exactement comme on l’a laissé (même depuis un autre PC) avec le ou les processus qui ont continué de s’exécuter.

Exercices

Exercice n°1

Débutant

Qu’est-ce qu’un PID sous Linux ?

Exercice n°2

Débutant

Quelle commande permet de voir une « photographie » instantanée des processus qui tournent sur votre machine ?

Exercice n°3

Débutant

Votre terminal est « bloqué » par une commande qui ne s’arrête pas. Quel raccourci clavier permet de l’interrompre proprement ?

Exercice n°4

Confirmé

Quelle est la différence entre top et ps aux ?

Exercice n°5

Confirmé

L’IA vous propose de lancer un script en arrière-plan avec & (ex: ./script.sh &). Quels sont les avantages et inconvénients ?

Exercice n°6

Confirmé

Comment forcer l’arrêt immédiat d’un processus dont le PID est 1234 si le signal d’arrêt normal ne fonctionne pas ?

Exercice n°7

Avancé

Vous avez lancé une tâche longue et vous devez éteindre votre PC ou fermer votre session SSH. Quel outil pouvez-vous utiliser pour laisser le processus tourner et y revenir plus tard ?

Exercice n°8

Avancé

Expliquez la hiérarchie parentale des processus. Quel est le « père de tous les processus » ?

Exercice n°9

Avancé

Dans htop, que représentent les barres de couleur en haut de l’écran ?

Exercice n°10

Expert

Comment ramener au premier plan un processus que vous avez mis en arrière-plan avec & ou suspendu avec Ctrl+Z ?

Exercice n°11

Expert

L’IA vous suggère d’utiliser killall python. Quel est le risque de cette commande par rapport à kill [PID] ?

Exercice n°12

Expert

Vous constatez que votre machine est très lente. Listez les étapes pour identifier le processus coupable avec les outils du cours.


Conclusion

Nous avons maintenant une vue d’ensemble de la “vie” interne de Linux :

  1. La Philosophie : Simplicité et modularité.
  2. Le Système de fichiers : Où tout est stocké.
  3. Le Dataflow : Comment les informations circulent.
  4. Les Processus : Comment les tâches sont exécutées et surveillées.

Maîtriser ces quatre piliers fait de vous un utilisateur capable de diagnostiquer une machine lente, de manipuler des données complexes et d’automatiser des tâches.

Mais un système Linux reste rarement seul dans son coin. Pour que nos processus puissent collaborer avec le reste du monde, nous devons comprendre comment ils communiquent à travers les réseaux. C’est l’objet du prochain chapitre : « Notions de réseau », où nous verrons que, là aussi, Linux traite les connexions avec une élégance et une logique implacables.


Réponses aux exercices

Exercice n°1

C’est le Process ID, une carte d’identité unique attribuée à chaque programme en cours d’exécution.

Exercice n°2

La commande ps . Elle est souvent utilisée avec les options aux: cette combinaison permet de disposer d’un affichage propre et lisible du nom du processus, du nom de l’utilisateur et de la consommation de ressources.

Exercice n°3

Le raccourci Ctrl+C. Le processus sera interrompu, ce qui permettra de reprendre la main sur le terminal.

Exercice n°4

ps aux donne une image fixe à l’instant T, alors que top (ou htop) fournit un affichage dynamique mis à jour en temps réel.

Exercice n°5

Cela permet de continuer à utiliser le terminal pour d’autres commandes pendant que le script s’exécute.

Par contre, la sortie standard du script continue de s’afficher dans le terminal, ce qui peut le rendre illisible.

Exercice n°6

Avec la commande kill -9 1234.

Exercice n°7

L’outil tmux (en utilisant “Detach” puis “Attach”) ou la commande nohup(moins élaboré mais plus simple).

Exercice n°8

Un processus parent crée des processus enfants. Le processus initial, père de tous, est init ou systemd.

Exercice n°9

Elles représentent la consommation des ressources système : CPU (processeur) et RAM (mémoire vive).

Exercice n°10

En utilisant la commande fg (foreground).

Exercice n°11

killall va arrêter tous les processus nommés python sur le système, ce qui peut causer l’arrêt accidentel d’autres scripts ou services dont vous avez besoin.

Exercice n°12

  1. Lancer top ou htop pour repérer visuellement les processus consommant le plus de CPU/RAM.
  2. Utiliser ps aux | grep ${nom} pour obtenir plus de détails si besoin.
  3. Identifier le PID et décider s’il faut le stopper avec killou killall.
  4. Retrouver les logs du programme (généralement un fichier de log dans le dossier /var/logs/${nom}/, ou dans le fichier /var/logs/${nom}.logs).
Write a comment
No comments yet.