Commande pgrep : trouver un PID par son nom, l'option -f et les différences avec pidof et pkill

Environnement de testFamille RHELAlmaLinux 9.8procps-ng 3.3Compte rootDebian 12 · procps-ng 4.0.2 compte standard
Commandes de processus et de planificationpgrep, pidofEmplacement/usr/bin/pgrep

Pour trouver le numéro (PID) d'un processus en cours d'exécution par son nom, son compte ou sa ligne de commande, on utilise la commande pgrep. Sur un serveur AlmaLinux 9, nous avons copié le programme sleep sous d'autres noms, lancé trois processus et comparé ceux que trouvait chaque option. La recherche par nom n'a renvoyé que ces trois processus, tandis que la recherche dans toute la ligne de commande avec -f a aussi renvoyé le timeout qui les avait lancés.

Les sorties ci-dessous proviennent du compte root d'un serveur AlmaLinux 9.8 et d'un compte ordinaire d'un serveur Debian 12. Les processus recherchés sont des copies de sleep nommées pgdemo-a et pgdemo-b, lancées avec timeout 300 pour qu'elles se terminent seules au bout de 5 minutes. Les numéros de processus (PID) et le nom du compte Debian (user1) ont été remplacés par des valeurs d'exemple, et la version de procps-ng du serveur AlmaLinux n'est indiquée que jusqu'à la version majeure et mineure.

1️⃣ Utilisation de base de la commande pgrep

  • ↪️ Trouver un PID par son nom et le code de sortie

Si vous écrivez une partie d'un nom après pgrep, il affiche, un par ligne, les numéros des processus dont le nom contient ces caractères. La recherche de pgdemo a renvoyé trois numéros : deux pgdemo-a et un pgdemo-b.

pgrep pgdemo
2143
2152
2155

En écrivant le nom jusqu'à pgdemo-a, il ne restait que les deux pgdemo-a.

pgrep pgdemo-a
2143
2152

Le texte recherché est lu comme une expression régulière étendue et, sans option, pgrep ne cherche que dans le nom du processus.

Si aucun processus ne correspond, pgrep se termine sans rien afficher : vérifiez donc le résultat avec le code de sortie. Après une recherche du nom inexistant pgdemo-zz, [echo $?] a renvoyé 1.

pgrep pgdemo-zz
echo $?
1

Lancé sans aucun critère, pgrep a affiché l'erreur ci-dessous avec le code de sortie 2. La page man décrit les codes de sortie ainsi : 0 (trouvé), 1 (non trouvé), 2 (erreur de syntaxe dans la ligne de commande) et 3 (erreur fatale, comme un manque de mémoire).

pgrep
pgrep: no matching criteria specified
Try `pgrep --help' for more information.
echo $?
2

En utilisant ce code de sortie comme condition plutôt que la sortie, un script peut vérifier si un processus est en cours d'exécution. La version s'affiche avec [pgrep -V]. Le serveur Debian 12 avait procps-ng 4.0.2 et le serveur AlmaLinux 9.8 procps-ng 3.3.

pgrep -V
pgrep from procps-ng 4.0.2

2️⃣ L'option pgrep -f et la sortie de -l et -a

  • ↪️ Les processus qui apparaissent aussi en cherchant dans toute la ligne de commande

Le numéro seul ne dit pas de quel processus il s'agit : affichez aussi le nom avec -l ou toute la ligne de commande avec -a.

pgrep -l pgdemo
2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-b
pgrep -a pgdemo
2143 ./pgdemo-a 300
2152 ./pgdemo-a 301
2155 ./pgdemo-b 300

Les 300 et 301 à la fin de la sortie de -a sont les arguments en secondes passés à sleep. Ces arguments nous ont permis de distinguer les deux pgdemo-a qui portent le même nom.

Avec -f, pgrep cherche dans toute la ligne de commande au lieu du nom. En cherchant pgdemo-a avec -f, les numéros sont passés de deux à quatre.

pgrep -f pgdemo-a
2141
2143
2150
2152

En ajoutant -a, on a vu que les deux lignes en plus étaient les timeout qui avaient reçu pgdemo-a en argument. Leur nom est timeout, mais leur ligne de commande contient pgdemo-a, ils correspondaient donc au critère de -f.

pgrep -af pgdemo-a
2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301

Quand vous utilisez -f dans un script, vérifiez si le script lui-même apparaît dans le résultat. pgrep ne s'inclut jamais lui-même dans le résultat, mais si la ligne de commande du script qui a lancé pgrep contient le texte recherché, ce script apparaît aussi.

En cherchant pgdemo-a avec chk.sh, un script qui transmet tel quel le texte reçu à [pgrep -af], le script lui-même s'est ajouté en dernière ligne : bash chk.sh pgdemo-a.

bash chk.sh pgdemo-a
2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301
2160 bash chk.sh pgdemo-a

Le motif [p]gdemo-a, qui met la première lettre entre crochets, trouve le même texte que pgdemo-a en tant qu'expression régulière, mais la ligne de commande du script contient les crochets tels quels, elle ne correspond donc plus. En passant ce motif au même script, la ligne du script a disparu et il ne restait que quatre lignes.

bash chk.sh '[p]gdemo-a'
2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301

3️⃣ Options de critères de pgrep

  • ↪️ -u pour le compte, -x pour le nom exact, -n et -o, -c pour compter

Avec -x, pgrep ne trouve que les processus dont le nom entier correspond, et non une partie. Avec pgdemo rien n'est sorti, et avec pgdemo-a deux processus sont sortis.

pgrep -x pgdemo
pgrep -lx pgdemo-a
2143 pgdemo-a
2152 pgdemo-a

-u sélectionne les processus selon le compte qui les a lancés. Si vous indiquez plusieurs comptes séparés par des virgules, il trouve tous les processus qui appartiennent à l'un d'eux. Les trois processus lancés en root sont tous sortis avec [-u root], et aucun avec [-u daemon].

pgrep -u root -l pgdemo
2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-b
pgrep -u daemon -l pgdemo
pgrep -u root,daemon -c pgdemo
3

Avec un compte qui n'existe pas, l'erreur [invalid user name] est apparue avec le code de sortie 2.

pgrep -u no-such-user9 pgdemo
pgrep: invalid user name: no-such-user9

Sur le serveur Debian 12 aussi, un compte ordinaire a trouvé avec les mêmes options le seul sleep lancé sous son propre compte.

pgrep -u user1 -l sleep
3047 sleep
pgrep -u user1 -a sleep
3047 sleep 60

Quand plusieurs processus portent le même nom, -n n'affiche que le plus récemment lancé et -o que le premier lancé. Parmi deux pgdemo-a lancés à 2 secondes d'intervalle, -n a choisi le plus récent et -o le plus ancien.

pgrep -n pgdemo-a
2152
pgrep -o pgdemo-a
2143

La page man indique que -n et -o ne peuvent pas être utilisés ensemble. Avec les deux, seul le mode d'emploi est apparu, sans message d'erreur.

-c affiche le nombre au lieu des numéros. S'il ne trouve rien, il affiche 0 et le code de sortie était 1.

pgrep -c pgdemo
3
pgrep -c pgdemo-zz
0

Voici le résumé des options de pgrep.

OptionCopierDescription
-f--fullChercher dans toute la ligne de commande au lieu du nom
-l--list-nameAfficher le nom avec le numéro
-a--list-fullAfficher toute la ligne de commande avec le numéro
-x--exactNe trouver que les processus dont le nom entier correspond
-u--euidSeulement les processus lancés par le compte indiqué ; avec plusieurs comptes séparés par des virgules, l'un d'eux
-n--newestLe plus récemment lancé parmi les correspondances
-o--oldestLe premier lancé parmi les correspondances
-c--countAfficher le nombre au lieu des numéros ; code de sortie 1 si 0
-d--delimiterDéfinir le séparateur entre les numéros (saut de ligne par défaut)
-V--versionAfficher la version
OptionCopierDescription
-i--ignore-caseChercher sans distinguer majuscules et minuscules
-v--inverseTrouver les processus qui ne correspondent pas
-P--parentSeulement les enfants du numéro de parent (PPID) indiqué
-t--terminalSeulement les processus rattachés au terminal indiqué
-g--pgroupSeulement les processus du numéro de groupe de processus indiqué
-s--sessionSeulement les processus du numéro de session indiqué
-U--uidSeulement les processus avec le même ID utilisateur réel
-G--groupSeulement les processus avec le même ID de groupe réel
-w--lightweightAfficher tous les numéros de thread au lieu des numéros de processus

🔲 Simulateur de la commande pgrep

Le simulateur ci-dessous démarre avec une liste des six lignes de pgdemo et timeout, plus des processus d'exemple. Touchez les puces pour comparer dans la liste de gauche les lignes trouvées par chaque option, et vérifiez avec [pgrep -l pgdemo] comment le résultat diminue après [pkill pgdemo-b].

Simulateur de la commande pgrepprocps-ng 3.3
[root@server work]#
Fonctionne uniquement dans votre navigateur. La liste de gauche contient des valeurs d'exemple, et [Trouvé à l'instant] s'affiche à côté des lignes trouvées par pgrep. [pkill] ne fait que simuler en retirant des lignes de la liste.

4️⃣ Différences entre pgrep, pidof et pkill

  • ↪️ pidof cherche le nom exact, pkill envoie un signal

pidof ne trouve, sans expression régulière, que les processus dont le nom de programme entier correspond, et affiche les numéros sur une seule ligne séparés par des espaces. La recherche de pgdemo-a a affiché les deux numéros sur une ligne, avec en premier 2152, lancé plus tard.

pidof pgdemo-a
2152 2143

Avec le nom partiel pgdemo, contrairement à pgrep, pidof n'a rien trouvé et le code de sortie était 1. Si vous n'avez besoin que d'un numéro, ajoutez -s. [pidof -s pgdemo-a] n'a affiché que 2152.

pidof pgdemo
pidof -s pgdemo-a
2152

Pour voir l'heure de démarrage et le numéro du parent (PPID) des numéros trouvés, reliez-les par des virgules avec pgrep -d et passez-les à l'option -p de la commande ps.

pgrep -d, pgdemo
2143,2152,2155
ps -fp $(pgrep -d, -x pgdemo-a)
UID          PID    PPID  C STIME TTY          TIME CMD
root        2143    2141  0 15:59 ?        00:00:00 ./pgdemo-a 300
root        2152    2150  0 15:59 ?        00:00:00 ./pgdemo-a 301

2141 et 2150 dans la colonne PPID sont les numéros des timeout qui ont lancé les deux pgdemo-a.

pkill trouve les processus avec les mêmes critères que pgrep, mais leur envoie un signal au lieu d'afficher leurs numéros. Sans signal indiqué, il envoie SIGTERM, et vous pouvez changer de signal comme dans [pkill -HUP nom].

pkill envoie le signal dès qu'il trouve une correspondance : vérifiez donc d'abord les cibles avec [pgrep -a] ou [pgrep -af] et les mêmes critères. Avec -f, les timeout ou les scripts dont la ligne de commande contient le même texte deviennent aussi des cibles. Si vous connaissez déjà le numéro, envoyez un signal à ce seul numéro avec la commande kill.

CommandeCritère de rechercheSortieRôle
pgrepPartie du nom (regex), ou toute la ligne de commande avec -fNuméros ; nom et ligne de commande avec -l, -aRecherche seulement
pidofNom entier du programmeNuméros sur une ligneRecherche seulement
pkillMêmes critères que pgrepNonSignal aux processus trouvés (SIGTERM par défaut)

🔢 FAQ & contenus recommandés

pgrep ne compare le nom du processus que jusqu'aux 15 caractères conservés dans /proc/PID/stat. Si le nom dépasse 15 caractères, cherchez avec les 15 premiers ou utilisez -f pour chercher dans toute la ligne de commande de /proc/PID/cmdline.

Quand on filtre la liste de ps avec grep, la ligne de commande de ce grep contient aussi le nom recherché, si bien qu'elle peut apparaître dans le résultat. pgrep ne s'inclut jamais lui-même dans le résultat et n'affiche que des numéros, faciles à passer à d'autres commandes.

Avec -v, pgrep inverse le critère et trouve les processus qui ne correspondent pas. Dans pkill, l'option courte -v est interdite pour éviter les erreurs.

ℹ️ Mention d'affiliation
Le contenu de ce site contient des liens d'affiliation. Lorsqu'un visiteur achète un produit ou un service via l'un de ces liens, le site perçoit une commission du vendeur. Le montant payé par l'acheteur(il baisse lors des promotions ↓), lui, n'augmente pas. Les prix, remises et stocks indiqués correspondent à la date de rédaction et peuvent différer ; vérifiez-les donc auprès du vendeur avant d'acheter. Les produits sont choisis et évalués selon nos propres critères, et les commissions n'influencent ni l'ordre de présentation ni le contenu des évaluations.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Prouvez que vous êtes humain : 0   +   3   =