Commande pgrep : trouver un PID par son nom, l'option -f et les différences avec pidof et pkill
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
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 pgdemo2143
2152
2155En écrivant le nom jusqu'à pgdemo-a, il ne restait que les deux pgdemo-a.
pgrep pgdemo-a2143
2152Le 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-zzecho $?1Lancé 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).
pgreppgrep: no matching criteria specified
Try `pgrep --help' for more information.echo $?2En 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 -Vpgrep from procps-ng 4.0.22️⃣ L'option pgrep -f et la sortie de -l et -a
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 pgdemo2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-bpgrep -a pgdemo2143 ./pgdemo-a 300
2152 ./pgdemo-a 301
2155 ./pgdemo-b 300Les 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-a2141
2143
2150
2152En 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-a2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301Quand 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-a2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301
2160 bash chk.sh pgdemo-aLe 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 3013️⃣ Options de critères de pgrep
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 pgdemopgrep -lx pgdemo-a2143 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 pgdemo2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-bpgrep -u daemon -l pgdemopgrep -u root,daemon -c pgdemo3Avec un compte qui n'existe pas, l'erreur [invalid user name] est apparue avec le code de sortie 2.
pgrep -u no-such-user9 pgdemopgrep: invalid user name: no-such-user9Sur 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 sleep3047 sleeppgrep -u user1 -a sleep3047 sleep 60Quand 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-a2152pgrep -o pgdemo-a2143La 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 pgdemo3pgrep -c pgdemo-zz0Voici le résumé des options de pgrep.
| Option | Copier | Description |
|---|---|---|
| -f--full | Chercher dans toute la ligne de commande au lieu du nom | |
| -l--list-name | Afficher le nom avec le numéro | |
| -a--list-full | Afficher toute la ligne de commande avec le numéro | |
| -x--exact | Ne trouver que les processus dont le nom entier correspond | |
| -u--euid | Seulement les processus lancés par le compte indiqué ; avec plusieurs comptes séparés par des virgules, l'un d'eux | |
| -n--newest | Le plus récemment lancé parmi les correspondances | |
| -o--oldest | Le premier lancé parmi les correspondances | |
| -c--count | Afficher le nombre au lieu des numéros ; code de sortie 1 si 0 | |
| -d--delimiter | Définir le séparateur entre les numéros (saut de ligne par défaut) | |
| -V--version | Afficher la version |
| Option | Copier | Description |
|---|---|---|
| -i--ignore-case | Chercher sans distinguer majuscules et minuscules | |
| -v--inverse | Trouver les processus qui ne correspondent pas | |
| -P--parent | Seulement les enfants du numéro de parent (PPID) indiqué | |
| -t--terminal | Seulement les processus rattachés au terminal indiqué | |
| -g--pgroup | Seulement les processus du numéro de groupe de processus indiqué | |
| -s--session | Seulement les processus du numéro de session indiqué | |
| -U--uid | Seulement les processus avec le même ID utilisateur réel | |
| -G--group | Seulement les processus avec le même ID de groupe réel | |
| -w--lightweight | Afficher 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].
4️⃣ Différences entre pgrep, pidof et pkill
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-a2152 2143Avec 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 pgdemopidof -s pgdemo-a2152Pour 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, pgdemo2143,2152,2155ps -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 3012141 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.
| Commande | Critère de recherche | Sortie | Rôle |
|---|---|---|---|
| pgrep | Partie du nom (regex), ou toute la ligne de commande avec -f | Numéros ; nom et ligne de commande avec -l, -a | Recherche seulement |
| pidof | Nom entier du programme | Numéros sur une ligne | Recherche seulement |
| pkill | Mêmes critères que pgrep | Non | Signal aux processus trouvés (SIGTERM par défaut) |
🔢 FAQ & contenus recommandés
Vérification en temps réel
Commande top sous Linux (vérifier l'utilisation du CPU et de la mémoire)
Commande qui affiche en temps réel la quantité de CPU et de mémoire utilisée par chaque processus.
Fichiers ouverts
[Linux] Commande lsof : afficher les informations des fichiers en cours d'utilisation
Commande qui affiche les fichiers ouverts par un processus, avec son PID.
Contrôle des tâches
Arrière-plan (Back Ground) et premier plan (Fore Ground) sous Linux : contrôler les processus
Méthode de contrôle des tâches pour envoyer une commande en arrière-plan puis la ramener au premier plan.
ℹ️ 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.