Aller au contenu
English
Compte : non connecté, synchronisation possible Mon apprentissage
Selectionner le thème
English

Gérer les processus sous Linux

Par mis à jour le

Améliorer cette page

Cinq commandes suffisent pour maîtriser les processus Linux : ps, top, kill, nice et renice. Avec elles, vous identifierez le processus qui monopolise un CPU, ajusterez sa priorité, et l'arrêterez proprement, sans jamais redémarrer le serveur.

  • Lister tous les processus actifs avec ps aux et ps -eo
  • Trouver un PID par nom avec pgrep et pidof
  • Lire les codes STAT (R, S, D, Z, T) et comprendre ce qu'ils signalent
  • Surveiller en temps réel avec top
  • Ajuster la priorité au lancement (nice) et sur un processus existant (renice)
  • Arrêter proprement : séquence SIGTERM → attente → SIGKILL
  • Explorer /proc/$PID/status et lsof pour diagnostiquer

Vous en avez besoin dès qu'un serveur se comporte anormalement :

  • un processus utilise 100 % d'un CPU depuis plusieurs minutes,
  • un service figure plusieurs fois dans ps aux (fuite de processus),
  • une tâche est bloquée en état D (I/O wait) et ne répond plus,
  • un zombie Z s'accumule sans disparaître,
  • vous devez tuer proprement un service avant une maintenance.

ps aux photographie tous les processus du système à un instant donné, ceux des autres utilisateurs compris. C'est le premier geste d'un diagnostic, avant de filtrer ou de trier.

Fenêtre de terminal
ps aux

Colonnes clés :

ColonneSignification
USERPropriétaire
PIDIdentifiant unique
%CPUPourcentage CPU utilisé
%MEMPourcentage mémoire
STATÉtat (voir plus bas)
COMMANDCommande lancée
Fenêtre de terminal
ps -eo pid,ppid,user,ni,stat,comm --sort=-%cpu | head -n 11

--sort=-%cpu trie par consommation décroissante, le signe moins portant l'inversion. head -n 11 conserve la ligne d'en-tête plus les dix premiers processus : avec head -n 10 vous n'en obtiendriez que neuf, l'en-tête comptant pour une ligne. Le pourcentage affiché est une moyenne depuis le démarrage du processus (le manuel de ps parle d'un ratio « cputime/realtime »), pas une mesure instantanée. Mesuré sur un processus qui a calculé cinq secondes puis dort : ps affiche encore 55 %, top affiche 0,0 %. Pour l'instantané, top reste l'outil adapté.

La colonne STAT est la première à regarder quand un processus « ne fait rien ». Elle combine une lettre majuscule donnant l'état du noyau, puis des caractères d'attribut optionnels. Deux valeurs demandent une réaction : D signale une attente d'entrée-sortie qu'aucun signal n'interrompt, et Z un processus déjà terminé que son parent n'a pas récupéré. Les autres sont le fonctionnement normal, S étant de loin le plus fréquent sur un serveur au repos.

CodeSignification
REn cours d'exécution (running)
SEn attente (sleeping, réveillable)
DBloqué sur I/O (non interruptible)
ZZombie (terminé, parent n'a pas lu le code retour)
TStoppé (Ctrl+Z ou SIGSTOP)
sLeader de session
+Processus de premier plan (foreground)
lMulti-thread
<Haute priorité (valeur nice négative)
NBasse priorité (valeur nice positive)

pgrep cherche un motif dans le nom des processus, pas un nom exact : pgrep lee trouve un sleep (mesuré). Ajoutez -x pour exiger le nom complet, et -a pour afficher la ligne de commande. pidof, lui, attend le nom exact du programme.

Fenêtre de terminal
# Par motif dans le nom (-x pour le nom exact)
pgrep nginx
# Plusieurs PIDs (plusieurs instances)
pidof bash
# Pattern dans ps avec filtre auto-excluant
ps aux | grep '[n]ginx'

L'astuce [n]ginx exclut la ligne du grep lui-même : le motif entre crochets correspond bien à la chaîne nginx, mais la ligne de commande de grep contient les crochets et ne correspond donc pas à son propre motif. Sans cette précaution, vous voyez toujours au moins un résultat, même quand le service est arrêté.

pstree dessine la hiérarchie parent-enfant des processus ; l'option -p ajoute les PID. Il appartient au paquet psmisc, présent dans l'image Debian 13 mesurée mais absent des images Ubuntu 24.04 et AlmaLinux 10 : installez ce paquet si la commande manque.

Fenêtre de terminal
pstree -p

Utile pour comprendre les relations parent-enfant, identifier un processus orphelin, ou voir les threads d'un service.

Là où ps fige un instantané, top rafraîchit son affichage toutes les trois secondes par défaut (deux trames en 3,2 s, mesuré sur Debian 13). C'est la différence qui compte pour un diagnostic : la colonne %CPU de top mesure l'intervalle écoulé depuis le rafraîchissement précédent, elle reflète donc l'activité courante et non la moyenne de vie du processus. Mesuré avec procps-ng 4.0.4, c'est vrai dès la première trame : un processus endormi après cinq secondes de calcul y affiche 0,0 %, là où ps garde 55 %.

Fenêtre de terminal
top

Touches interactives utiles :

ToucheAction
PTrier par CPU
MTrier par mémoire
kEnvoyer un signal à un processus
rChanger la priorité (renice)
qQuitter

Chaque processus a une valeur nice de −20 (haute priorité) à +19 (basse priorité). La valeur par défaut est 0. Plus on monte, moins le processus est prioritaire.

Fenêtre de terminal
nice -n 15 tar czf archive.tar.gz /data

Pratique pour des tâches longues (sauvegardes, compilations) qui ne doivent pas perturber les autres services.

renice agit sur un processus déjà lancé, sans le redémarrer : c'est ce qui sauve une sauvegarde partie sans nice un jour de forte charge. Sa sortie donne l'ancienne et la nouvelle valeur (old priority 3, new priority 5), et un refus s'affiche clairement : renice: failed to set priority for 1234 (process ID): Permission denied, avec un code retour 1. Encadrez tout de même la commande de deux lectures de la colonne NI : c'est la preuve que la priorité a changé.

Fenêtre de terminal
# Vérifier la valeur actuelle
ps -o pid,ni,comm -p 1234
# Changer la priorité
renice -n 10 -p 1234
# Vérifier après
ps -o pid,ni,comm -p 1234

Attention à un piège de syntaxe : avec la version util-linux présente sur Debian, Ubuntu et RHEL (2.39 à 2.41), -n fixe une valeur absolue. Elle ne s'ajoute pas à la valeur courante : mesuré, renice -n 5 sur un processus à 3 donne 5, et renice --relative 2 le fait ensuite passer à 7. Le comportement bascule aussi en relatif si la variable POSIXLY_CORRECT est présente dans l'environnement.

Un signal est une notification envoyée à un processus par le noyau. La plupart peuvent être interceptés par le programme, qui décide alors quoi en faire : c'est exactement ce qui permet à nginx de recharger sa configuration sur SIGHUP sans couper les connexions en cours. Deux exceptions dans le tableau ci-dessous, SIGKILL et SIGSTOP, que le noyau applique sans laisser au programme la moindre chance de réagir. Retenez les noms plutôt que les numéros : kill -TERM fonctionne partout, alors que la numérotation varie selon l'architecture matérielle.

NuméroNomEffet
1SIGHUPRechargement de configuration
2SIGINTInterruption clavier (Ctrl+C)
15SIGTERMDemande d'arrêt propre (défaut)
9SIGKILLArrêt forcé immédiat (non interceptable)
19SIGSTOPPause (non interceptable)
18SIGCONTReprise après pause
Fenêtre de terminal
# 1. Demande d'arrêt propre
kill -TERM 1234
# 2. Attendre quelques secondes, puis vérifier
sleep 3 && ps -p 1234
# 3. Forcer seulement si le processus ne répond toujours pas
kill -9 1234

Travailler par nom évite l'aller-retour par pgrep pour récupérer un PID, mais la contrepartie est réelle : la commande frappe tous les processus qui correspondent, y compris ceux des autres utilisateurs. Prenez le réflexe de lancer d'abord pgrep -a <nom> pour voir la liste exacte des cibles avant d'envoyer quoi que ce soit. Sans privilèges, chaque processus hors de votre portée produit pkill: killing pid … failed: Operation not permitted. Mesuré : le code retour reste 0 si au moins un processus a reçu le signal, il passe à 1 si tous ont été refusés.

Fenêtre de terminal
# Voir d'abord ce qui va être touché, avec la ligne de commande complète
pgrep -a nginx
# Envoyer SIGTERM à tous les processus nommés "nginx"
pkill -TERM nginx
# Se limiter à ses propres processus
pkill -u "$USER" -TERM nginx
# Demander à nginx de relire sa configuration (PID du processus maître)
kill -HUP "$(cat /run/nginx.pid)"
# Tuer tous les processus d'un nom (killall)
killall -SIGTERM firefox

pkill cherche un motif dans le nom, killall exige par défaut le nom complet de la commande. Conséquence pratique : pkill ngin atteint nginx, killall ngin ne trouve rien. Les deux appartiennent à des paquets différents, procps pour pkill et psmisc pour killall, et killall n'est pas toujours installé : mesuré, il manque aux images Ubuntu 24.04 et AlmaLinux 10. Pour un service géré par systemd, préférez systemctl reload à un kill -HUP : systemd sait quel processus viser.

Linux expose les informations de chaque processus dans /proc/<PID>/ :

Fenêtre de terminal
# Fiche du processus courant
cat /proc/$$/status
# Extraire les champs utiles
grep -E "^(Name|Pid|PPid|State|VmRSS)" /proc/1234/status

Exemple de sortie :

Name: nginx
State: S (sleeping)
Pid: 1234
PPid: 1
VmRSS: 8560 kB

lsof (list open files) liste les fichiers, sockets et bibliothèques qu'un processus tient ouverts. Il n'était installé dans aucune des trois images mesurées : le paquet s'appelle lsof partout. Sans lui, ls -l /proc/1234/fd donne déjà la liste des descripteurs ouverts.

Fenêtre de terminal
lsof -p 1234

Ou pour trouver quel processus utilise un port, avec ss en alternative (paquet iproute2, installé sur tout serveur) :

Fenêtre de terminal
lsof -i :80
sudo ss -tlnp 'sport = :80'

Les six situations ci-dessous couvrent la quasi-totalité des appels reçus sur ce sujet. Lisez-les dans le sens symptôme puis cause avant d'appliquer la solution : les deux premières lignes se ressemblent à l'écran mais n'ont rien à voir. Un processus que kill -9 n'atteint pas est un problème matériel ou de montage réseau, pas un problème de signal ; s'obstiner à renvoyer le signal ne changera rien.

SymptômeCause probableSolution
kill -9 1234 ne tue pas le processusÉtat D (I/O bloqué, non interruptible)Diagnostiquer le sous-système I/O (disque, NFS)
pkill nginx ne trouve rienNom de commande différent du binaireUtiliser pgrep pour confirmer le nom exact
renice refusé avec Permission deniedUtilisateur non root qui baisse la valeur nice, même de 10 à 5Utiliser sudo renice
pstree ou killall introuvablePaquet psmisc absentInstaller psmisc
Zombie Z qui ne disparaît pasProcessus parent n'a pas appelé wait()Identifier le parent avec ps -o ppid -p $ZOMBIE, tuer le parent si possible
top ne rafraîchit plusTerminal geléq ou Ctrl+C, puis relancer
  • ps aux liste tous les processus ; ps -eo choisit les colonnes.
  • pgrep <motif> (ou pgrep -x <nom> pour le nom exact) et ps aux | grep '[n]om' trouvent un PID par nom.
  • Les codes STAT (R, S, D, Z, T) indiquent l'état, D et Z méritent attention.
  • nice -n N commande (priorité au lancement) ; renice -n N -p PID (après démarrage, valeur absolue).
  • Toujours SIGTERM d'abord, attendre, puis SIGKILL seulement si nécessaire.
  • /proc/$PID/status diagnostique sans aucun outil à installer ; lsof -p $PID complète, une fois le paquet lsof installé.

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

Ce projet vous est utile ?

Les guides, formations, quiz et labs restent gratuits. Si vous les utilisez régulièrement, vous pouvez contribuer à leur maintenance et à leur développement.

Devenir membre de soutien (nouvel onglet) Soutenir une fois (nouvel onglet) En savoir plus

Suivez aussi le projet sur LinkedIn