pgrep-opdracht: een PID op naam vinden, de optie -f en het verschil met pidof en pkill

TestomgevingRHEL-familieAlmaLinux 9.8procps-ng 3.3root-accountDebian 12 · procps-ng 4.0.2 gewoon account
Commando's voor processen · taakplanningpgrep, pidofLocatie/usr/bin/pgrep

Om het nummer (PID) van een draaiend proces te vinden op naam, account of opdrachtregel, gebruikt u de opdracht pgrep. Op een AlmaLinux 9-server kopieerden we het programma sleep onder andere namen, startten we er drie en vergeleken we welke processen elke optie vond. Zoeken op naam gaf alleen die drie processen, terwijl zoeken in de hele opdrachtregel met -f ook de timeout gaf die ze had gestart.

De uitvoer hieronder komt van het root-account op een AlmaLinux 9.8-server en van een gewoon account op een Debian 12-server. Gezocht werd naar kopieën van sleep met de namen pgdemo-a en pgdemo-b, gestart met timeout 300 zodat ze na 5 minuten vanzelf stopten. Procesnummers (PID) en de Debian-accountnaam (user1) zijn vervangen door voorbeeldwaarden, en de procps-ng-versie op de AlmaLinux-server staat alleen tot de hoofd- en subversie vermeld.

1️⃣ Basisgebruik van de pgrep-opdracht

  • ↪️ Een PID op naam vinden en de exitcode

Als u na pgrep een deel van een naam schrijft, toont het de nummers van de processen waarvan de naam die tekens bevat, één per regel. Zoeken op pgdemo gaf drie nummers: twee pgdemo-a en één pgdemo-b.

pgrep pgdemo
2143
2152
2155

Met de naam tot en met pgdemo-a bleven alleen de twee pgdemo-a over.

pgrep pgdemo-a
2143
2152

De zoektekst wordt gelezen als uitgebreide reguliere expressie, en zonder opties zoekt pgrep alleen in de procesnaam.

Als geen enkel proces overeenkomt, stopt pgrep zonder iets te tonen, dus controleert u het resultaat met de exitcode. Na het zoeken naar de niet-bestaande naam pgdemo-zz gaf [echo $?] de waarde 1.

pgrep pgdemo-zz
echo $?
1

Zonder enige voorwaarde uitgevoerd kwam de fout hieronder samen met exitcode 2. De man-pagina beschrijft de exitcodes als 0 (gevonden), 1 (niet gevonden), 2 (syntaxfout in de opdrachtregel) en 3 (fatale fout, zoals geheugentekort).

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

Gebruikt u deze exitcode in plaats van de uitvoer als voorwaarde, dan kan een script controleren of een proces draait. De versie ziet u met [pgrep -V]. De Debian 12-server had procps-ng 4.0.2 en de AlmaLinux 9.8-server procps-ng 3.3.

pgrep -V
pgrep from procps-ng 4.0.2

2️⃣ De optie pgrep -f en de uitvoer van -l en -a

  • ↪️ Processen die meekomen bij zoeken in de hele opdrachtregel

Aan het nummer alleen ziet u niet welk proces het is, dus toont u met -l ook de naam en met -a de hele opdrachtregel.

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

De 300 en 301 aan het eind van de -a-uitvoer zijn de argumenten in seconden die aan sleep zijn meegegeven. Met deze argumenten onderscheidden we de twee pgdemo-a met dezelfde naam.

Met -f zoekt pgrep in de hele opdrachtregel in plaats van in de naam. Zoeken op pgdemo-a met -f verhoogde het aantal nummers van twee naar vier.

pgrep -f pgdemo-a
2141
2143
2150
2152

Met -a erbij bleek dat de twee extra regels de timeout-processen waren die pgdemo-a als argument hadden gekregen. Hun naam is timeout, maar hun opdrachtregel bevat pgdemo-a, dus voldeden ze aan de voorwaarde van -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

Gebruikt u -f in een script, controleer dan of het script zelf in het resultaat verschijnt. pgrep neemt zichzelf nooit op in het resultaat, maar als de opdrachtregel van het script dat pgrep startte de zoektekst bevat, verschijnt dat script ook.

Bij het zoeken naar pgdemo-a met chk.sh, een script dat de ontvangen tekst ongewijzigd aan [pgrep -af] doorgeeft, kwam op de laatste regel het script zelf erbij: 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

Het patroon [p]gdemo-a, met de eerste letter tussen vierkante haken, vindt als reguliere expressie dezelfde tekst als pgdemo-a, maar in de opdrachtregel van het script staan de haken letterlijk, dus komt die niet meer overeen. Met dit patroon viel de scriptregel weg en bleven er maar vier regels over.

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️⃣ Voorwaardeopties van pgrep

  • ↪️ -u voor account, -x voor exacte naam, -n en -o, -c voor aantal

Met -x vindt pgrep alleen processen waarvan de hele naam overeenkomt, niet een deel. Met pgdemo kwam er niets uit, met pgdemo-a twee processen.

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

-u selecteert processen op het account dat ze startte. Geeft u meerdere accounts op, gescheiden door komma's, dan vindt het alle processen van een van die accounts. De drie als root gestarte processen kwamen allemaal uit met [-u root], en met [-u daemon] kwam er geen.

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

Met een account dat niet bestaat kwam de fout [invalid user name] samen met exitcode 2.

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

Ook met een gewoon account op de Debian 12-server vonden we met dezelfde opties de ene sleep die onder dat account was gestart.

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

Als meerdere processen dezelfde naam hebben, toont -n alleen het laatst gestarte en -o alleen het eerst gestarte. Van twee pgdemo-a die met 2 seconden ertussen waren gestart, koos -n het latere en -o het eerdere.

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

Volgens de man-pagina kunnen -n en -o niet samen worden gebruikt. Met beide kwam alleen de gebruiksinstructie, zonder foutmelding.

-c toont het aantal in plaats van de nummers. Als er niets wordt gevonden, toont het 0 en was de exitcode 1.

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

Hier volgt een overzicht van de opties van pgrep.

OptieKopiërenUitleg
-f--fullIn de hele opdrachtregel zoeken in plaats van in de naam
-l--list-nameNaam samen met het nummer tonen
-a--list-fullHele opdrachtregel samen met het nummer tonen
-x--exactAlleen processen vinden waarvan de hele naam overeenkomt
-u--euidAlleen processen van het opgegeven account; bij meerdere gescheiden door komma's, een van die accounts
-n--newestHet laatst gestarte van de treffers
-o--oldestHet eerst gestarte van de treffers
-c--countAantal tonen in plaats van nummers; exitcode 1 bij 0
-d--delimiterScheidingsteken tussen de nummers instellen (standaard een nieuwe regel)
-V--versionVersie tonen
OptieKopiërenUitleg
-i--ignore-caseZoeken zonder onderscheid tussen hoofd- en kleine letters
-v--inverseProcessen vinden die niet overeenkomen
-P--parentAlleen kindprocessen van het opgegeven oudernummer (PPID)
-t--terminalAlleen processen die aan de opgegeven terminal hangen
-g--pgroupAlleen processen in het opgegeven procesgroepnummer
-s--sessionAlleen processen in het opgegeven sessienummer
-U--uidAlleen processen met dezelfde echte gebruikers-ID
-G--groupAlleen processen met dezelfde echte groeps-ID
-w--lightweightAlle threadnummers tonen in plaats van procesnummers

🔲 Simulator voor de pgrep-opdracht

De simulator hieronder begint met een lijst van de zes regels van pgdemo en timeout plus voorbeeldprocessen. Tik op de chips om in de lijst links te vergelijken welke regels elke optie vindt, en bekijk met [pgrep -l pgdemo] na [pkill pgdemo-b] hoe het resultaat kleiner wordt.

Simulator voor de pgrep-opdrachtprocps-ng 3.3
[root@server work]#
Werkt alleen in uw browser. De lijst links bevat voorbeeldwaarden, en naast de regels die pgrep vindt verschijnt [Just matched]. [pkill] doet alleen alsof door regels uit de lijst te halen.

4️⃣ Verschil tussen pgrep, pidof en pkill

  • ↪️ pidof zoekt de exacte naam, pkill stuurt een signaal

pidof vindt zonder reguliere expressies alleen processen waarvan de hele programmanaam overeenkomt, en toont de nummers op één regel, gescheiden door spaties. Zoeken op pgdemo-a toonde beide nummers op één regel, met 2152, het later gestarte, vooraan.

pidof pgdemo-a
2152 2143

Met de gedeeltelijke naam pgdemo vond pidof, anders dan pgrep, niets, en de exitcode was 1. Hebt u maar één nummer nodig, voeg dan -s toe. [pidof -s pgdemo-a] toonde alleen 2152.

pidof pgdemo
pidof -s pgdemo-a
2152

Om de starttijd en het oudernummer (PPID) van de gevonden nummers te zien, voegt u ze met pgrep -d samen met komma's en geeft u ze door aan -p van de ps-opdracht.

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 en 2150 in de kolom PPID zijn de nummers van de timeout-processen die de twee pgdemo-a startten.

pkill zoekt processen met dezelfde voorwaarden als pgrep, maar stuurt ze een signaal in plaats van hun nummers te tonen. Zonder signaal stuurt het SIGTERM, en u kunt het signaal wijzigen zoals in [pkill -HUP naam].

pkill stuurt het signaal zodra het een treffer vindt, dus controleer de doelen eerst met [pgrep -a] of [pgrep -af] en dezelfde voorwaarden. Met -f worden ook timeout-processen of scripts waarvan de opdrachtregel dezelfde tekst bevat een doel. Als u het nummer al kent, gebruikt u de kill-opdracht om alleen naar dat nummer een signaal te sturen.

CommandoZoekt opUitvoerTaak
pgrepDeel van de naam (regex), met -f de hele opdrachtregelNummers; naam en opdrachtregel met -l, -aAlleen zoeken
pidofHele programmanaamNummers op één regelAlleen zoeken
pkillDezelfde voorwaarden als pgrepGeenSignaal naar de gevonden processen (standaard SIGTERM)

🔢 FAQ & aanbevolen content

pgrep vergelijkt procesnamen alleen tot de 15 tekens die in /proc/PID/stat staan. Is een naam langer dan 15 tekens, zoek dan met de eerste 15 tekens of met -f in de hele opdrachtregel uit /proc/PID/cmdline.

Als u de ps-lijst met grep filtert, bevat de opdrachtregel van die grep ook de gezochte naam, zodat die in het resultaat kan meekomen. pgrep neemt zichzelf nooit op in het resultaat en toont alleen nummers, die makkelijk aan andere opdrachten door te geven zijn.

Met -v keert pgrep de voorwaarde om en vindt het processen die niet overeenkomen. In pkill kan de korte optie -v niet worden gebruikt, om vergissingen te voorkomen.

ℹ️ Affiliatemelding
De content van deze site bevat affiliatelinks. Koopt een bezoeker via een van deze links een product of dienst, dan ontvangt deze site een commissie van de verkoper. Het bedrag dat de koper betaalt (bij acties gaat het omlaag ↓) wordt daardoor niet hoger. De vermelde prijzen, kortingen en voorraad gelden op het moment van schrijven en kunnen afwijken; controleer ze daarom vóór je aankoop bij de verkoper. Producten worden gekozen en beoordeeld volgens onze eigen criteria, en commissies hebben geen invloed op de volgorde of de inhoud van de beoordelingen.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Laat zien dat je geen machine bent: 1   +   7   =