Comando pgrep: trovare il PID per nome, l'opzione -f e le differenze con pidof e pkill

Ambiente di testFamiglia RHELAlmaLinux 9.8procps-ng 3.3account rootDebian 12 · procps-ng 4.0.2 account normale
Comandi per processi · pianificazionepgrep, pidofPosizione/usr/bin/pgrep

Per trovare il numero (PID) di un processo in esecuzione in base al nome, all'account o alla riga di comando si usa il comando pgrep. Su un server AlmaLinux 9 abbiamo copiato il programma sleep con altri nomi, avviato tre processi e confrontato quelli trovati da ciascuna opzione. Cercando per nome sono usciti solo quei tre processi, mentre cercando in tutta la riga di comando con -f è uscito anche il timeout che li aveva avviati.

Gli output qui sotto provengono dall'account root di un server AlmaLinux 9.8 e da un account normale di un server Debian 12. I processi cercati sono copie di sleep chiamate pgdemo-a e pgdemo-b, avviate con timeout 300 perché terminassero da sole dopo 5 minuti. I numeri di processo (PID) e il nome dell'account Debian (user1) sono stati sostituiti con valori di esempio, e la versione di procps-ng del server AlmaLinux è indicata solo fino alla versione principale e secondaria.

1️⃣ Uso di base del comando pgrep

  • ↪️ Trovare il PID per nome e il codice di uscita

Se scrivi una parte di un nome dopo pgrep, stampa i numeri dei processi il cui nome contiene quei caratteri, uno per riga. Cercando pgdemo sono usciti tre numeri: due pgdemo-a e un pgdemo-b.

pgrep pgdemo
2143
2152
2155

Scrivendo il nome fino a pgdemo-a sono rimasti solo i due pgdemo-a.

pgrep pgdemo-a
2143
2152

Il testo cercato viene letto come espressione regolare estesa e, senza opzioni, la ricerca avviene solo nel nome del processo.

Se nessun processo corrisponde, termina senza stampare nulla, quindi il risultato si controlla con il codice di uscita. Dopo aver cercato il nome inesistente pgdemo-zz, eseguendo [echo $?] è uscito 1.

pgrep pgdemo-zz
echo $?
1

Eseguito senza alcuna condizione, è uscito l'errore qui sotto insieme al codice di uscita 2. La pagina man descrive i codici di uscita come 0 (trovato), 1 (non trovato), 2 (errore di sintassi nella riga di comando) e 3 (errore fatale, come memoria esaurita).

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

Usando questo codice di uscita come condizione al posto dell'output, uno script può verificare se un processo è in esecuzione. La versione si vede con [pgrep -V]. Il server Debian 12 aveva procps-ng 4.0.2 e il server AlmaLinux 9.8 procps-ng 3.3.

pgrep -V
pgrep from procps-ng 4.0.2

2️⃣ L'opzione pgrep -f e l'output di -l e -a

  • ↪️ Processi che escono anche cercando in tutta la riga di comando

Dal solo numero non si capisce di quale processo si tratti, quindi si stampa anche il nome con -l o tutta la riga di comando con -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

I valori 300 e 301 alla fine dell'output di -a sono gli argomenti in secondi passati a sleep. Con questi argomenti abbiamo distinto i due pgdemo-a con lo stesso nome.

Con -f, pgrep cerca in tutta la riga di comando invece che nel nome. Cercando pgdemo-a con -f, i numeri sono passati da due a quattro.

pgrep -f pgdemo-a
2141
2143
2150
2152

Aggiungendo anche -a si è visto che le due righe in più erano i timeout che avevano ricevuto pgdemo-a come argomento. Il loro nome è timeout, ma la loro riga di comando contiene pgdemo-a, quindi rispettavano la condizione di -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

Quando usi -f dentro uno script, controlla se lo script stesso compare nel risultato. pgrep non include mai sé stesso nel risultato, ma se la riga di comando dello script che ha eseguito pgrep contiene il testo cercato, anche quello script compare.

Cercando pgdemo-a con chk.sh, uno script che passa così com'è il testo ricevuto a [pgrep -af], nell'ultima riga si è aggiunto lo script stesso: 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

Il modello [p]gdemo-a, che racchiude la prima lettera tra parentesi quadre, come espressione regolare trova lo stesso testo di pgdemo-a, ma nella riga di comando dello script le parentesi sono scritte così come sono, quindi non corrisponde più. Passando questo modello allo stesso script, la riga dello script è sparita e sono rimaste solo quattro righe.

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️⃣ Opzioni di condizione di pgrep

  • ↪️ -u per account, -x per nome esatto, -n e -o, -c per contare

Con -x, pgrep trova solo i processi il cui nome intero coincide, non una parte. Con pgdemo non è uscito nulla, con pgdemo-a ne sono usciti due.

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

-u seleziona i processi in base all'account che li ha avviati. Se scrivi più account separati da virgole, trova tutti i processi che appartengono a uno qualsiasi di essi. I tre processi avviati come root sono usciti tutti con [-u root], e con [-u daemon] non ne è uscito nessuno.

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

Con un account inesistente è uscito l'errore [invalid user name] insieme al codice di uscita 2.

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

Anche con un account normale del server Debian 12 abbiamo trovato con le stesse opzioni l'unico sleep avviato con quell'account.

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

Quando più processi hanno lo stesso nome, -n stampa solo quello avviato più di recente e -o solo quello avviato per primo. Dei due pgdemo-a avviati a 2 secondi di distanza, -n ha scelto il più recente e -o il più vecchio.

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

La pagina man indica che -n e -o non si possono usare insieme. Scrivendole entrambe è uscito solo il modo d'uso, senza messaggio di errore.

-c stampa il numero di processi invece dei loro numeri. Se non trova nulla stampa 0, e il codice di uscita era 1.

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

Ecco il riepilogo delle opzioni di pgrep.

OpzioneCopiaDescrizione
-f--fullCercare in tutta la riga di comando invece che nel nome
-l--list-nameStampare il nome insieme al numero
-a--list-fullStampare tutta la riga di comando insieme al numero
-x--exactTrovare solo i processi il cui nome intero coincide
-u--euidSolo i processi avviati dall'account indicato; con più account separati da virgole, uno qualsiasi
-n--newestIl più recente tra quelli che corrispondono
-o--oldestIl primo avviato tra quelli che corrispondono
-c--countStampare il conteggio invece dei numeri; codice di uscita 1 se è 0
-d--delimiterImpostare il separatore tra i numeri (a capo per impostazione predefinita)
-V--versionStampare la versione
OpzioneCopiaDescrizione
-i--ignore-caseCercare senza distinguere maiuscole e minuscole
-v--inverseTrovare i processi che non corrispondono
-P--parentSolo i processi figli del numero di padre (PPID) indicato
-t--terminalSolo i processi collegati al terminale indicato
-g--pgroupSolo i processi del numero di gruppo di processi indicato
-s--sessionSolo i processi del numero di sessione indicato
-U--uidSolo i processi con lo stesso ID utente reale
-G--groupSolo i processi con lo stesso ID gruppo reale
-w--lightweightStampare tutti i numeri di thread invece dei numeri di processo

🔲 Simulatore del comando pgrep

Il simulatore qui sotto parte da un elenco con le sei righe di pgdemo e timeout più alcuni processi di esempio. Tocca i chip per confrontare nell'elenco a sinistra le righe trovate da ciascuna opzione, e verifica con [pgrep -l pgdemo] come si riduce il risultato dopo [pkill pgdemo-b].

Simulatore del comando pgrepprocps-ng 3.3
[root@server work]#
Funziona solo nel browser. L'elenco a sinistra contiene valori di esempio, e accanto alle righe trovate da pgrep compare [Just matched]. [pkill] simula soltanto, togliendo righe dall'elenco.

4️⃣ Differenze tra pgrep, pidof e pkill

  • ↪️ pidof cerca il nome esatto, pkill invia un segnale

pidof trova, senza espressioni regolari, solo i processi il cui nome di programma intero coincide, e stampa i numeri su una riga separati da spazi. Cercando pgdemo-a sono usciti i due numeri su una riga, con davanti 2152, avviato dopo.

pidof pgdemo-a
2152 2143

Con il nome parziale pgdemo, a differenza di pgrep, pidof non ha trovato nulla e il codice di uscita era 1. Se ti serve un solo numero, aggiungi -s. [pidof -s pgdemo-a] ha stampato solo 2152.

pidof pgdemo
pidof -s pgdemo-a
2152

Per vedere l'ora di avvio e il numero del padre (PPID) dei numeri trovati, uniscili con le virgole usando pgrep -d e passali a -p del comando 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

I valori 2141 e 2150 nella colonna PPID sono i numeri dei timeout che hanno avviato i due pgdemo-a.

pkill trova i processi con le stesse condizioni di pgrep, ma invece di stamparne i numeri invia loro un segnale. Se non indichi il segnale invia SIGTERM, e puoi cambiarlo come in [pkill -HUP nome].

pkill invia il segnale appena trova una corrispondenza, quindi controlla prima i destinatari con [pgrep -a] o [pgrep -af] e le stesse condizioni. Con -f diventano destinatari anche i timeout o gli script la cui riga di comando contiene lo stesso testo. Se conosci già il numero, invia il segnale solo a quel numero con il comando kill.

ComandoCriterio di ricercaOutputCompito
pgrepParte del nome (regex) o, con -f, tutta la riga di comandoNumeri; nome e riga di comando con -l, -aSolo ricerca
pidofNome intero del programmaNumeri su una rigaSolo ricerca
pkillStesse condizioni di pgrepNessunoSegnale ai processi trovati (SIGTERM predefinito)

🔢 FAQ & contenuti consigliati

pgrep confronta il nome del processo solo fino ai 15 caratteri conservati in /proc/PID/stat. Se il nome supera i 15 caratteri, cerca con i primi 15 oppure usa -f per cercare in tutta la riga di comando di /proc/PID/cmdline.

Se filtri l'elenco di ps con grep, anche la riga di comando di quel grep contiene il nome cercato, quindi può comparire nel risultato. pgrep non include mai sé stesso nel risultato e stampa solo numeri, facili da passare ad altri comandi.

Con -v la condizione viene invertita e pgrep trova i processi che non corrispondono. In pkill l'opzione breve -v non si può usare, per evitare errori.

ℹ️ Informativa sull'affiliazione
I contenuti di questo sito includono link di affiliazione. Se un visitatore acquista un prodotto o un servizio tramite uno di questi link, il sito riceve una commissione dal venditore. In questo processo l'importo pagato dall'acquirente (durante le promozioni l'importo scende↓) non aumenta. Prezzi, sconti e disponibilità indicati si riferiscono al momento della stesura e possono differire da quelli reali: prima di acquistare verifica sempre presso il venditore. I prodotti vengono scelti e valutati secondo criteri propri, e le commissioni non influiscono sull'ordine di presentazione né sul contenuto delle valutazioni.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Dimostra di essere umano: 0   +   1   =