pgrep-Befehl: PID über den Namen finden, die Option -f und Unterschiede zu pidof und pkill

TestumgebungRHEL-FamilieAlmaLinux 9.8procps-ng 3.3root-KontoDebian 12 · procps-ng 4.0.2 normales Konto
Befehle für Prozesse · Zeitplanungpgrep, pidofSpeicherort/usr/bin/pgrep

Um die Nummer (PID) eines laufenden Prozesses über seinen Namen, sein Konto oder seine Befehlszeile zu finden, verwenden Sie den Befehl pgrep. Auf einem AlmaLinux-9-Server haben wir das Programm sleep unter anderen Namen kopiert, drei Prozesse gestartet und verglichen, welche Prozesse jede Option findet. Bei der Suche nach dem Namen kamen nur diese drei Prozesse heraus, bei der Suche in der ganzen Befehlszeile mit -f zusätzlich das timeout, das sie gestartet hatte.

Die Ausgaben unten stammen vom root-Konto auf einem AlmaLinux-9.8-Server und von einem normalen Konto auf einem Debian-12-Server. Gesucht wurden Kopien von sleep mit den Namen pgdemo-a und pgdemo-b, die mit timeout 300 gestartet wurden, damit sie sich nach 5 Minuten selbst beenden. Prozessnummern (PID) und der Debian-Kontoname (user1) wurden durch Beispielwerte ersetzt, und die procps-ng-Version auf dem AlmaLinux-Server ist nur bis zur Haupt- und Nebenversion angegeben.

1️⃣ Grundlegende Verwendung des pgrep-Befehls

  • ↪️ PID über den Namen finden und der Exit-Code

Wenn Sie nach pgrep einen Teil eines Namens angeben, gibt es die Nummern der Prozesse, deren Name diese Zeichen enthält, zeilenweise aus. Die Suche nach pgdemo ergab drei Nummern: zwei pgdemo-a und ein pgdemo-b.

pgrep pgdemo
2143
2152
2155

Mit dem Namen bis pgdemo-a blieben nur die beiden pgdemo-a übrig.

pgrep pgdemo-a
2143
2152

Der Suchtext wird als erweiterter regulärer Ausdruck gelesen, und ohne Optionen wird nur im Prozessnamen gesucht.

Wenn kein Prozess passt, gibt pgrep nichts aus und endet, daher prüfen Sie das Ergebnis mit dem Exit-Code. Nach der Suche nach dem nicht vorhandenen Namen pgdemo-zz ergab [echo $?] den Wert 1.

pgrep pgdemo-zz
echo $?
1

Ohne jede Bedingung ausgeführt, kamen der Fehler unten und der Exit-Code 2. Die Manpage beschreibt die Exit-Codes als 0 (gefunden), 1 (nicht gefunden), 2 (Syntaxfehler in der Befehlszeile) und 3 (schwerer Fehler wie Speichermangel).

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

Wenn Sie statt der Ausgabe diesen Exit-Code als Bedingung verwenden, kann ein Skript prüfen, ob ein Prozess läuft. Die Version zeigt [pgrep -V]. Der Debian-12-Server hatte procps-ng 4.0.2, der AlmaLinux-9.8-Server procps-ng 3.3.

pgrep -V
pgrep from procps-ng 4.0.2

2️⃣ Die Option pgrep -f und die Ausgabe von -l, -a

  • ↪️ Prozesse, die bei der Suche in der ganzen Befehlszeile mitkommen

An der Nummer allein sieht man nicht, welcher Prozess es ist, daher gibt man mit -l den Namen und mit -a die ganze Befehlszeile mit aus.

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

Die 300 und 301 am Ende der -a-Ausgabe sind die an sleep übergebenen Argumente in Sekunden. Mit diesen Argumenten haben wir die beiden gleichnamigen pgdemo-a unterschieden.

Mit -f sucht pgrep nicht im Namen, sondern in der ganzen Befehlszeile. Bei der Suche nach pgdemo-a mit -f stieg die Zahl der Nummern von zwei auf vier.

pgrep -f pgdemo-a
2141
2143
2150
2152

Mit zusätzlichem -a zeigte sich, dass die zwei neuen Zeilen die timeout-Prozesse waren, die pgdemo-a als Argument erhalten hatten. Ihr Name ist timeout, aber ihre Befehlszeile enthält pgdemo-a, daher passten sie zur Bedingung von -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

Wenn Sie -f in einem Skript verwenden, prüfen Sie, ob das Skript selbst im Ergebnis erscheint. pgrep nimmt sich selbst nie in das Ergebnis auf, aber wenn die Befehlszeile des Skripts, das pgrep gestartet hat, den Suchtext enthält, erscheint auch dieses Skript.

Bei der Suche nach pgdemo-a mit chk.sh, einem Skript, das den erhaltenen Text unverändert an [pgrep -af] weitergibt, kam in der letzten Zeile das Skript selbst hinzu: 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

Das Muster [p]gdemo-a, bei dem der erste Buchstabe in eckige Klammern gesetzt ist, findet als regulärer Ausdruck denselben Text wie pgdemo-a, aber in der Befehlszeile des Skripts stehen die Klammern wörtlich, daher passt sie nicht mehr. Mit diesem Muster fiel die Skriptzeile weg, und es blieben nur vier Zeilen.

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️⃣ Bedingungsoptionen von pgrep

  • ↪️ -u für das Konto, -x für den genauen Namen, -n und -o, -c für die Anzahl

Mit -x findet pgrep nur Prozesse, deren ganzer Name übereinstimmt, nicht nur ein Teil. Mit pgdemo kam nichts heraus, mit pgdemo-a zwei Prozesse.

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

-u wählt Prozesse nach dem Konto aus, das sie gestartet hat. Wenn Sie mehrere Konten durch Kommas getrennt angeben, findet es alle Prozesse, die zu einem dieser Konten gehören. Die drei als root gestarteten Prozesse kamen mit [-u root] alle heraus, mit [-u daemon] keiner.

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

Mit einem Konto, das es nicht gibt, kamen der Fehler [invalid user name] und der Exit-Code 2.

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

Auch mit einem normalen Konto auf dem Debian-12-Server fanden wir mit denselben Optionen den einen sleep, der unter diesem Konto gestartet wurde.

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

Wenn mehrere Prozesse denselben Namen haben, gibt -n nur den zuletzt gestarteten und -o nur den zuerst gestarteten aus. Von zwei pgdemo-a, die im Abstand von 2 Sekunden gestartet wurden, wählte -n den späteren und -o den früheren.

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

Laut Manpage können -n und -o nicht zusammen verwendet werden. Mit beiden kam nur der Hilfetext zur Verwendung, ohne Fehlermeldung.

-c gibt statt der Nummern die Anzahl aus. Wird nichts gefunden, gibt es 0 aus, und der Exit-Code war 1.

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

Die Optionen von pgrep im Überblick:

OptionKopierenBeschreibung
-f--fullIn der ganzen Befehlszeile statt im Namen suchen
-l--list-nameNamen zusammen mit der Nummer ausgeben
-a--list-fullGanze Befehlszeile zusammen mit der Nummer ausgeben
-x--exactNur Prozesse finden, deren ganzer Name übereinstimmt
-u--euidNur Prozesse des angegebenen Kontos; bei mehreren durch Kommas getrennt eines davon
-n--newestDer zuletzt gestartete unter den Treffern
-o--oldestDer zuerst gestartete unter den Treffern
-c--countAnzahl statt Nummern ausgeben; Exit-Code 1 bei 0 Treffern
-d--delimiterTrennzeichen zwischen den Nummern festlegen (Standard: Zeilenumbruch)
-V--versionVersion ausgeben
OptionKopierenBeschreibung
-i--ignore-caseOhne Unterscheidung von Groß- und Kleinschreibung suchen
-v--inverseProzesse finden, die nicht passen
-P--parentNur Kindprozesse der angegebenen Elternnummer (PPID)
-t--terminalNur Prozesse am angegebenen Terminal
-g--pgroupNur Prozesse der angegebenen Prozessgruppennummer
-s--sessionNur Prozesse der angegebenen Sitzungsnummer
-U--uidNur Prozesse mit derselben realen Benutzer-ID
-G--groupNur Prozesse mit derselben realen Gruppen-ID
-w--lightweightAlle Thread-Nummern statt Prozessnummern ausgeben

🔲 Simulator für den pgrep-Befehl

Der Simulator unten startet mit einer Liste aus den sechs Zeilen von pgdemo und timeout plus Beispielprozessen. Tippen Sie auf die Chips, um in der Liste links zu vergleichen, welche Zeilen jede Option findet, und sehen Sie mit [pgrep -l pgdemo] nach [pkill pgdemo-b], wie das Ergebnis schrumpft.

Simulator für den pgrep-Befehlprocps-ng 3.3
[root@server work]#
Läuft nur in Ihrem Browser. Die Liste links enthält Beispielwerte, und neben den Zeilen, die pgrep findet, erscheint [Gerade gefunden]. [pkill] löscht nur zum Schein Zeilen aus der Liste.

4️⃣ Unterschiede zwischen pgrep, pidof und pkill

  • ↪️ pidof sucht den genauen Namen, pkill sendet ein Signal

pidof findet ohne reguläre Ausdrücke nur Prozesse, deren ganzer Programmname übereinstimmt, und gibt die Nummern in einer Zeile durch Leerzeichen getrennt aus. Die Suche nach pgdemo-a ergab beide Nummern in einer Zeile, vorne 2152, der später gestartete.

pidof pgdemo-a
2152 2143

Mit dem Namensteil pgdemo fand pidof anders als pgrep nichts, und der Exit-Code war 1. Wenn Sie nur eine Nummer brauchen, fügen Sie -s hinzu. [pidof -s pgdemo-a] gab nur 2152 aus.

pidof pgdemo
pidof -s pgdemo-a
2152

Um Startzeit und Elternnummer (PPID) der gefundenen Nummern zu sehen, verbinden Sie die Nummern mit pgrep -d durch Kommas und übergeben sie mit -p an den ps-Befehl.

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 und 2150 in der Spalte PPID sind die Nummern der timeout-Prozesse, die die beiden pgdemo-a gestartet haben.

pkill sucht Prozesse mit denselben Bedingungen wie pgrep, sendet ihnen aber ein Signal, statt die Nummern auszugeben. Ohne Angabe sendet es SIGTERM, und Sie können das Signal wie in [pkill -HUP Name] ändern.

pkill sendet das Signal, sobald es einen Treffer findet, daher prüfen Sie die Ziele zuerst mit [pgrep -a] oder [pgrep -af] und denselben Bedingungen. Mit -f werden auch timeout-Prozesse oder Skripte zum Ziel, deren Befehlszeile denselben Text enthält. Wenn Sie die Nummer bereits kennen, senden Sie mit dem kill-Befehl nur an diese Nummer ein Signal.

BefehlSucht nachAusgabeWas es tut
pgrepTeil des Namens (Regex), mit -f die ganze BefehlszeileNummern; Name und Befehlszeile mit -l, -aNur suchen
pidofGanzer ProgrammnameNummern in einer ZeileNur suchen
pkillDieselben Bedingungen wie pgrepNeinSignal an die gefundenen Prozesse (Standard SIGTERM)

🔢 FAQ & empfohlene Inhalte

pgrep vergleicht Prozessnamen nur bis zu den 15 Zeichen, die in /proc/PID/stat stehen. Ist ein Name länger als 15 Zeichen, suchen Sie mit den ersten 15 Zeichen oder mit -f in der ganzen Befehlszeile aus /proc/PID/cmdline.

Wenn Sie die ps-Liste mit grep filtern, enthält auch die Befehlszeile dieses grep den gesuchten Namen, sodass es im Ergebnis mit erscheinen kann. pgrep nimmt sich selbst nie in das Ergebnis auf und gibt nur Nummern aus, die sich leicht an andere Befehle übergeben lassen.

Mit -v kehrt pgrep die Bedingung um und findet Prozesse, die nicht passen. In pkill ist die kurze Option -v gesperrt, um Fehler zu vermeiden.

ℹ️ Affiliate-Hinweis
Die Inhalte dieser Website enthalten Affiliate-Links. Kauft ein Besucher über einen dieser Links ein Produkt oder eine Dienstleistung, erhält die Website vom Verkäufer eine Provision. Der Betrag, den der Käufer zahlt(bei Aktionsrabatten sinkt er ↓), steigt dadurch nicht. Angegebene Preise, Rabatte und Lagerbestände entsprechen dem Stand bei Erstellung und können abweichen; prüfe sie daher vor dem Kauf beim Verkäufer. Produkte werden nach eigenen Kriterien ausgewählt und bewertet, und Provisionen beeinflussen weder die Reihenfolge noch den Inhalt der Bewertungen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Beweisen Sie, dass Sie ein Mensch sind: 6   +   6   =