Perché "ps aux | grep x "dà risultati migliori di" pgrep x "?


82

Ho appena provato il seguente comando sul mio Ubuntu, non mostra nulla:

pgrep php5

non dovrebbe restituire l'id di processo di php5 (cosa che fa il seguente comando) ?:

ps aux | grep php5

Quindi, qual è la differenza tra questi due comandi?

Risposte:


75

ps auxinclude l'intera riga di comando (percorso e parametri), mentre pgrep guarda solo i primi 15 caratteri dei nomi dell'eseguibile

ps auxrestituisce la riga di comando completa di ogni processo, mentre pgrepesamina solo i nomi degli eseguibili.

Ciò significa che l' ps aux output grepping corrisponderà a tutto ciò che si verifica nel percorso o nei parametri di un processo "binario: ad esempio"

  • ps aux | grep php5 corrisponderà /usr/share/php5/i-am-a-perl-script.pl
  • ma pgrep php5non lo farà

Prendi un esempio dal mio sistema - solo noi useremo python invece di php5:

  • ps aux | grep python ci da:
izx 2348 0,0 0,7 514928 15644? Sl Jun24 0:00 / usr / bin / python / usr / lib / unity-lens-video / unity-lens-video
izx 2444 0,0 0,9 547392 18864? Sl Jun24 0:01 / usr / bin / python / usr / lib / unity-scope-video-remote / unity-scope-video-remote
radice 2805 0,0 0,5 95436 12204? S Jun24 0:00 / usr / bin / python / usr / lib / system-service / system-service-d
izx 6272 0,0 2,9 664400 60320? SNl giu24 1:16 / usr / bin / python / usr / bin / update-manager --no-focus-on-map
radice 11729 0,0 0,9 180508 19516? S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus
  • Ma pgrep pythonrestituisce solo 11729, che vedrai dall'elenco sopra è:
radice 11729 0,0 0,9 180508 19516? S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus

3
"pgrep -l" tronca anche il processo a 15 caratteri, che è probabilmente un bug ma è stato così per secoli
Thorsen,

1
Beh, è ​​nel launchpad come un bug a monte dal 2008 :) "comando top e ps troncato dopo 15 caratteri" bugs.launchpad.net/ubuntu/+source/procps/+bug/295876
Thorsen,

2
Ah, questo lo spiega, dal commento # 3: Ciò è dovuto al fatto che alcune procedure di proc ottengono il nome del comando /proc/<pid>/statma non da/proc/<pid>/cmdline . OK, @Thorsen, si vince lo spray, si tratta di un bug: P
ish

2
@xczzhh pgrepnon è un comando irragionevole. Funziona bene e come progettato. Il problema è semplicemente che ti mancava un'opzione quando la esegui, non puoi incolparla pgrep. L'uso ps aux | grep xxxè inaffidabile, quindi è necessario hack per filtrare grepse stesso dall'output e potrebbe dare falsi positivi come con ps aux | grep root.
jlliagre,

1
Questo dovrebbe essere in uno spot anti-droga, i creatori di strumenti bash erano così infuocati sull'LSD che pensavano che cose come questa fossero ben progettate
Andy Ray

78

Il ps aux | grep xcomando fornisce risultati "migliori" rispetto pgrep xessenzialmente perché manca un'opzione con quest'ultimo.

Basta usare l' -fopzione per pgrepcercare l'intera riga di comando e non solo il nome del processo che è il suo comportamento predefinito, ad esempio:

pgrep -f php5

A differenza della ps | grepcostruzione con cui è necessario filtrare la greplinea o utilizzare trucchi con motivi, pgrepsemplicemente non si sceglierà dal punto di vista del design.

Inoltre, se il tuo modello appare nella ps USERcolonna, otterrai processi indesiderati nell'output, pgrepnon soffre di questo difetto.

Se desideri dettagli completi anziché solo i pid, puoi utilizzare:

ps wup $(pgrep -f python)

che è più semplice e più affidabile di

ps aux | grep python | grep -v grep

o

ps aux | grep p[y]thon

3
Aggiungi anche l' opzione -a( --list-full) se vuoi vedere l'intera riga di comando e non solo il pid. (I precedenti pgrep no -a, lo facevano-fl .)
Beni Cherniavsky-Paskin,

1
La domanda originale era porre la differenza, ma questo in realtà dà a quelli di noi che cercano pgrepdi giocare bene la soluzione. +1
ore

@ 2rs2ts Grazie, mi mancava davvero rispondere alla domanda posta. Riparato ora.
jlliagre,

In alcuni casi, quando i programmi si modificano /proc/self/cmdlineper essere "descrittivi", pgrep -fa rubynon corrisponderanno ad es. puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker], mentre il "più scemo" lo pgrep -a rubyfarà. Non sono sicuro che anche quest'ultimo possa essere ingannato.
Beni Cherniavsky-Paskin,

@ BeniCherniavsky-Paskin Immagino che avrebbe potuto essere un commento alla domanda, dal momento che si applica a entrambi pgrepe ps.
Franklin Yu,

3
diff <(ps aux|grep x) <(pgrep x) # :)

12
Questo può rispondere alla risposta alla domanda, ma forse puoi espandere la tua risposta per spiegare cosa fa questo comando a una riga.
Fossfreedom

1

In questo momento, psfornirà un output più completo di pgep -fquanto pgrep sia limitato ai primi 4.096 caratteri (spesso interessano gli utenti Java che cercano la classe di ingresso di un programma Java con un percorso di classe lungo). Il bug tracking è questo: https://gitlab.com/procps-ng/procps/issues/86


Ho cercato per sempre questo.
venerdì
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.