Linux / Commande pkill : vérifier les cibles puis envoyer un signal
pkill envoie un signal aux processus qui correspondent à un nom et aux critères indiqués. Sans signal explicite, il envoie SIGTERM, une demande de terminaison. Vérifiez d'abord les cibles avec pgrep et les mêmes critères : un motif large peut sélectionner plusieurs processus.
Passer de la recherche à une action réelle
pkill [options] motif
Pgrep recherche et affiche les PID ; pkill agit sur les processus correspondants. Pour examiner un nom entier avant une demande de terminaison :
pgrep -a -x myworker
Ce nom est un exemple, pas un programme à supposer installé. Après avoir identifié tous les résultats comme les tâches que vous souhaitez réellement arrêter, la demande correspondante serait :
pkill -TERM -x myworker
pkill -x myworker demande le même signal par défaut. Le motif reste une expression régulière : -x impose une correspondance sur tout le nom, mais ne transforme pas les métacaractères en texte littéral. La vérification pgrep est un contrôle préalable, pas un verrou : la liste des processus peut changer avant pkill.
Réduire le périmètre avec un utilisateur
Si plusieurs comptes exécutent le même programme, associez le nom à l'utilisateur effectif. Remplacez alice par le compte voulu et vérifiez d'abord :
pgrep -a -u alice -x myworker
La commande d'action utilise ensuite les mêmes critères :
pkill -TERM -u alice -x myworker
La sélection d'un compte ne vous accorde pas de droits supplémentaires pour lui envoyer un signal. Un refus doit être interprété selon les permissions et le contexte du système ; il ne justifie pas de relancer automatiquement une sélection plus large avec sudo.
Faire un essai avec un processus créé pour l'exercice
Dans un terminal Bash sur une machine Linux de pratique, assurez-vous que procps-ng fournit pgrep et pkill et que GNU sleep est installé. Créez un exemplaire nommé de sleep dans un nouveau répertoire, puis lancez-le pour 120 secondes :
pkill_lab=$(mktemp -d "$HOME/pkill-demo.XXXXXX") || exit 1
cp -- "$(command -v sleep)" "$pkill_lab/lf-pkill-demo" || exit 1
"$pkill_lab/lf-pkill-demo" 120 &
demo_pid=$!
printf 'PID créé : %s\n' "$demo_pid"
pgrep -a -u "$(id -u)" -P "$$" -x lf-pkill-demo
Le dernier relevé doit désigner uniquement le PID que vous venez de créer, avec le chemin de votre copie et l'argument 120. Le critère -P limite la sélection aux enfants directs du shell ; -u limite l'utilisateur et -x le nom. Si le résultat manque ou contient une autre cible, arrêtez l'exercice à cette étape et vérifiez la cause. Le processus finira seul après son délai.
Après cette vérification, envoyez TERM avec exactement les mêmes critères, attendez la fin de votre enfant, puis refaites la recherche :
pkill -TERM -u "$(id -u)" -P "$$" -x lf-pkill-demo
wait "$demo_pid"
pgrep -a -u "$(id -u)" -P "$$" -x lf-pkill-demo
La dernière recherche doit être vide une fois l'enfant terminé. Bash peut afficher une indication de terminaison ; wait renvoie un état non nul pour un enfant terminé par signal. Le répertoire temporaire et la copie de l'exécutable restent présents. Cette procédure décrit un essai ciblé, pas une commande à transposer à des services en production.
Comprendre les options et le résultat
| Option procps-ng | Effet |
|---|---|
-x |
Exiger une correspondance sur tout le nom, ou toute la ligne avec -f. |
-f |
Rechercher dans la ligne complète, ce qui peut sélectionner des arguments et des commandes enveloppantes. |
-u utilisateur |
Limiter par utilisateur effectif. |
-TERM |
Demander explicitement SIGTERM. |
-e |
Afficher le nom et le PID des processus auxquels le signal est envoyé. |
Un code de sortie 0 indique qu'au moins un processus a été trouvé et signalé avec succès ; il ne prouve ni la terminaison de tous les résultats ni l'achèvement d'un arrêt propre. Le code 1 indique une absence de correspondance ou l'impossibilité de signaler les processus trouvés ; 2 indique une erreur de syntaxe et 3 une erreur fatale.
SIGTERM peut être traité par l'application pour effectuer une fermeture propre, mais le comportement dépend du programme. SIGKILL ne peut pas être intercepté pour exécuter ce nettoyage. Pour un service, privilégiez sa procédure d'arrêt normale et vérifiez ensuite son état et ses journaux. Un gestionnaire peut aussi le redémarrer automatiquement.
Le manuel commun de pgrep et pkill détaille la sélection et les retours ; la présentation des signaux Linux explique leur traitement. Vérifiez aussi man pkill sur votre distribution.




