pgrep-Befehl: PID über den Namen finden, die Option -f und Unterschiede zu pidof und pkill
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
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 pgdemo2143
2152
2155Mit dem Namen bis pgdemo-a blieben nur die beiden pgdemo-a übrig.
pgrep pgdemo-a2143
2152Der 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-zzecho $?1Ohne 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).
pgreppgrep: no matching criteria specified
Try `pgrep --help' for more information.echo $?2Wenn 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 -Vpgrep from procps-ng 4.0.22️⃣ Die Option pgrep -f und die Ausgabe von -l, -a
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 pgdemo2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-bpgrep -a pgdemo2143 ./pgdemo-a 300
2152 ./pgdemo-a 301
2155 ./pgdemo-b 300Die 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-a2141
2143
2150
2152Mit 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-a2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301Wenn 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-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-aDas 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 3013️⃣ Bedingungsoptionen von pgrep
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 pgdemopgrep -lx pgdemo-a2143 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 pgdemo2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-bpgrep -u daemon -l pgdemopgrep -u root,daemon -c pgdemo3Mit einem Konto, das es nicht gibt, kamen der Fehler [invalid user name] und der Exit-Code 2.
pgrep -u no-such-user9 pgdemopgrep: invalid user name: no-such-user9Auch 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 sleep3047 sleeppgrep -u user1 -a sleep3047 sleep 60Wenn 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-a2152pgrep -o pgdemo-a2143Laut 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 pgdemo3pgrep -c pgdemo-zz0Die Optionen von pgrep im Überblick:
| Option | Kopieren | Beschreibung |
|---|---|---|
| -f--full | In der ganzen Befehlszeile statt im Namen suchen | |
| -l--list-name | Namen zusammen mit der Nummer ausgeben | |
| -a--list-full | Ganze Befehlszeile zusammen mit der Nummer ausgeben | |
| -x--exact | Nur Prozesse finden, deren ganzer Name übereinstimmt | |
| -u--euid | Nur Prozesse des angegebenen Kontos; bei mehreren durch Kommas getrennt eines davon | |
| -n--newest | Der zuletzt gestartete unter den Treffern | |
| -o--oldest | Der zuerst gestartete unter den Treffern | |
| -c--count | Anzahl statt Nummern ausgeben; Exit-Code 1 bei 0 Treffern | |
| -d--delimiter | Trennzeichen zwischen den Nummern festlegen (Standard: Zeilenumbruch) | |
| -V--version | Version ausgeben |
| Option | Kopieren | Beschreibung |
|---|---|---|
| -i--ignore-case | Ohne Unterscheidung von Groß- und Kleinschreibung suchen | |
| -v--inverse | Prozesse finden, die nicht passen | |
| -P--parent | Nur Kindprozesse der angegebenen Elternnummer (PPID) | |
| -t--terminal | Nur Prozesse am angegebenen Terminal | |
| -g--pgroup | Nur Prozesse der angegebenen Prozessgruppennummer | |
| -s--session | Nur Prozesse der angegebenen Sitzungsnummer | |
| -U--uid | Nur Prozesse mit derselben realen Benutzer-ID | |
| -G--group | Nur Prozesse mit derselben realen Gruppen-ID | |
| -w--lightweight | Alle 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.
4️⃣ Unterschiede zwischen pgrep, pidof und pkill
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-a2152 2143Mit 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 pgdemopidof -s pgdemo-a2152Um 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, 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 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.
| Befehl | Sucht nach | Ausgabe | Was es tut |
|---|---|---|---|
| pgrep | Teil des Namens (Regex), mit -f die ganze Befehlszeile | Nummern; Name und Befehlszeile mit -l, -a | Nur suchen |
| pidof | Ganzer Programmname | Nummern in einer Zeile | Nur suchen |
| pkill | Dieselben Bedingungen wie pgrep | Nein | Signal an die gefundenen Prozesse (Standard SIGTERM) |
🔢 FAQ & empfohlene Inhalte
Echtzeit-Prüfung
Linux-Befehl top (CPU- und Speicherauslastung prüfen)
Befehl, der in Echtzeit zeigt, wie viel CPU und Speicher jeder Prozess verwendet.
Geöffnete Dateien
[Linux] lsof-Befehl: Informationen zu geöffneten Dateien ausgeben
Befehl, der die von einem Prozess geöffneten Dateien zusammen mit seiner PID zeigt.
Jobsteuerung
Linux-Hintergrund (Back Ground) und Vordergrund (Fore Ground): Prozesse steuern
Jobsteuerung, mit der du einen Befehl in den Hintergrund schickst und wieder nach vorne holst.
ℹ️ 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.