Comando pgrep: trovare il PID per nome, l'opzione -f e le differenze con pidof e pkill
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
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 pgdemo2143
2152
2155Scrivendo il nome fino a pgdemo-a sono rimasti solo i due pgdemo-a.
pgrep pgdemo-a2143
2152Il 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-zzecho $?1Eseguito 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).
pgreppgrep: no matching criteria specified
Try `pgrep --help' for more information.echo $?2Usando 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 -Vpgrep from procps-ng 4.0.22️⃣ L'opzione pgrep -f e l'output di -l e -a
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 pgdemo2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-bpgrep -a pgdemo2143 ./pgdemo-a 300
2152 ./pgdemo-a 301
2155 ./pgdemo-b 300I 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-a2141
2143
2150
2152Aggiungendo 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-a2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301Quando 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-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-aIl 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 3013️⃣ Opzioni di condizione di pgrep
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 pgdemopgrep -lx pgdemo-a2143 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 pgdemo2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-bpgrep -u daemon -l pgdemopgrep -u root,daemon -c pgdemo3Con un account inesistente è uscito l'errore [invalid user name] insieme al codice di uscita 2.
pgrep -u no-such-user9 pgdemopgrep: invalid user name: no-such-user9Anche 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 sleep3047 sleeppgrep -u user1 -a sleep3047 sleep 60Quando 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-a2152pgrep -o pgdemo-a2143La 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 pgdemo3pgrep -c pgdemo-zz0Ecco il riepilogo delle opzioni di pgrep.
| Opzione | Copia | Descrizione |
|---|---|---|
| -f--full | Cercare in tutta la riga di comando invece che nel nome | |
| -l--list-name | Stampare il nome insieme al numero | |
| -a--list-full | Stampare tutta la riga di comando insieme al numero | |
| -x--exact | Trovare solo i processi il cui nome intero coincide | |
| -u--euid | Solo i processi avviati dall'account indicato; con più account separati da virgole, uno qualsiasi | |
| -n--newest | Il più recente tra quelli che corrispondono | |
| -o--oldest | Il primo avviato tra quelli che corrispondono | |
| -c--count | Stampare il conteggio invece dei numeri; codice di uscita 1 se è 0 | |
| -d--delimiter | Impostare il separatore tra i numeri (a capo per impostazione predefinita) | |
| -V--version | Stampare la versione |
| Opzione | Copia | Descrizione |
|---|---|---|
| -i--ignore-case | Cercare senza distinguere maiuscole e minuscole | |
| -v--inverse | Trovare i processi che non corrispondono | |
| -P--parent | Solo i processi figli del numero di padre (PPID) indicato | |
| -t--terminal | Solo i processi collegati al terminale indicato | |
| -g--pgroup | Solo i processi del numero di gruppo di processi indicato | |
| -s--session | Solo i processi del numero di sessione indicato | |
| -U--uid | Solo i processi con lo stesso ID utente reale | |
| -G--group | Solo i processi con lo stesso ID gruppo reale | |
| -w--lightweight | Stampare 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].
4️⃣ Differenze tra pgrep, pidof e pkill
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-a2152 2143Con 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 pgdemopidof -s pgdemo-a2152Per 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, 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 301I 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.
| Comando | Criterio di ricerca | Output | Compito |
|---|---|---|---|
| pgrep | Parte del nome (regex) o, con -f, tutta la riga di comando | Numeri; nome e riga di comando con -l, -a | Solo ricerca |
| pidof | Nome intero del programma | Numeri su una riga | Solo ricerca |
| pkill | Stesse condizioni di pgrep | Nessuno | Segnale ai processi trovati (SIGTERM predefinito) |
🔢 FAQ & contenuti consigliati
Controllo in tempo reale
Comando top di Linux (controllare l'uso di CPU e memoria)
Comando che mostra in tempo reale quanta CPU e memoria usa ogni processo.
File aperti
[Linux] Comando lsof: mostrare le informazioni sui file in uso
Comando che mostra i file aperti da un processo, insieme al suo PID.
Controllo dei job
Background (Back Ground) e foreground (Fore Ground) in Linux: controllare i processi
Metodo di controllo dei job per mandare un comando in background e riportarlo in primo piano.
ℹ️ 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.