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

72

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

pgrep php5

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

ps aux | grep php5

Quindi, qual è la differenza tra questi due comandi?

    
posta xczzhh 28.06.2012 - 11:43

3 risposte

62

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

ps aux restituisce l'intera riga di comando di ogni processo, mentre pgrep controlla solo i nomi degli eseguibili.

Ciò significa che l'output di grepping ps aux corrisponderà a qualsiasi cosa si verifichi nel percorso o ai parametri di un processo "binario: ad es. '

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

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

  • ps aux | grep python ci dà:
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
root      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  Jun24   1:16 /usr/bin/python /usr/bin/update-manager --no-focus-on-map
root     11729  0.0  0.9 180508 19516 ?        S    Jun25   0:00 python /usr/lib/software-properties/software-properties-dbus
  • Ma pgrep python restituisce solo 11729 , che vedrai dall'elenco precedente:
root     11729  0.0  0.9 180508 19516 ?        S    Jun25   0:00 python /usr/lib/software-properties/software-properties-dbus
    
risposta data ish 28.06.2012 - 12:00
69

Il comando ps aux | grep x restituisce risultati "migliori" di pgrep x essenzialmente perché manca un'opzione con quest'ultima.

Usa semplicemente l'opzione -f per pgrep per cercare la riga di comando completa e non solo il nome del processo che è il suo comportamento predefinito, ad esempio:

pgrep -f php5

Diversamente dalla costruzione ps | grep con la quale devi filtrare la riga grep o utilizzare i trucchi del modello, pgrep non si selezionerà automaticamente in base alla progettazione.

Inoltre, se il tuo pattern appare in ps USER colonna, otterrai output indesiderati nell'output, pgrep non soffre di questo difetto.

Se vuoi i dettagli completi invece dei soli pid, puoi usare:

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
    
risposta data jlliagre 09.09.2012 - 10:37
1
diff <(ps aux|grep x) <(pgrep x) # :)
    
risposta data Thorsen 28.06.2012 - 12:09

Leggi altre domande sui tag