¿Por qué "ps aux | grep x "da mejores resultados que" pgrep x "?

72

Acabo de probar el siguiente comando en mi Ubuntu, no muestra nada:

pgrep php5

¿no debería devolver la identificación del proceso de php5 (que el siguiente comando simplemente hace)?:

ps aux | grep php5

Entonces, ¿cuál es la diferencia entre estos dos comandos?

    
pregunta xczzhh 28.06.2012 - 11:43

3 respuestas

62

ps aux incluye la línea de comando completa (ruta y parámetros), mientras que pgrep solo mira los primeros 15 caracteres de los nombres del ejecutable

ps aux devuelve la línea de comando completa de cada proceso, mientras que pgrep solo mira los nombres de los ejecutables.

Eso significa que grepping ps aux output coincidirá con cualquier cosa que ocurra en la ruta o los parámetros de un proceso 'binary: p. '

  • ps aux | grep php5 coincidirá /usr/share/php5/i-am-a-perl-script.pl
  • pero pgrep php5 no

Tome un ejemplo de mi sistema: solo usaremos python en lugar de php5 :

  • ps aux | grep python nos 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
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
  • Pero pgrep python solo devuelve 11729 , que verá en la lista anterior es:
root     11729  0.0  0.9 180508 19516 ?        S    Jun25   0:00 python /usr/lib/software-properties/software-properties-dbus
    
respondido por el ish 28.06.2012 - 12:00
70

El comando ps aux | grep x da resultados "mejores" que pgrep x esencialmente porque te falta una opción con este último.

Simplemente use la opción -f para pgrep para buscar en la línea de comando completa y no solo el nombre del proceso, que es su comportamiento predeterminado, por ejemplo:

pgrep -f php5

A diferencia de la construcción ps | grep con la que necesita filtrar la línea grep o usar trucos de patrones, pgrep simplemente no se elegirá por diseño.

Además, si tu patrón aparece en la columna ps USER , obtendrás procesos no deseados en la salida, pgrep no sufre este defecto.

Si quiere detalles completos en lugar de solo los pids, puede usar:

ps wup $(pgrep -f python)

que es más simple y más confiable que

ps aux | grep python | grep -v grep

o

ps aux | grep p[y]thon
    
respondido por el jlliagre 09.09.2012 - 10:37
1
diff <(ps aux|grep x) <(pgrep x) # :)
    
respondido por el Thorsen 28.06.2012 - 12:09

Lea otras preguntas en las etiquetas