ps auxincluye 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 auxdevuelve la línea de comando completa de cada proceso, mientras pgrepsolo mira los nombres de los ejecutables.
Eso significa que la salida grepping ps aux coincidirá con cualquier cosa que ocurra en la ruta o los parámetros de un proceso 'binario: por ejemplo,'
ps aux | grep php5 coincidirá /usr/share/php5/i-am-a-perl-script.pl
- pero
pgrep php5no lo hará
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
raíz 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
raíz 11729 0.0 0.9 180508 19516? S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus
- Pero
pgrep pythonsolo devuelve 11729, lo que verá en la lista anterior es:
raíz 11729 0.0 0.9 180508 19516? S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus
/proc/<pid>/statpero no de/proc/<pid>/cmdline. OK, @Thorsen, ganas el repelente de insectos, es un error: Ppgrepno es un comando irrazonable. Funciona bien y según lo diseñado. El problema es que simplemente te faltaba una opción cuando la ejecutas, no puedes culparlopgreppor eso. El usops aux | grep xxxno es confiable, por lo que es necesario que los piratas se filtrengrepdesde la salida y podrían dar falsos positivos como conps aux | grep root.El
ps aux | grep xcomando da "mejores" resultados quepgrep xesencialmente porque le falta una opción con este último.Simplemente use la
-fopción parapgrepbuscar la línea de comando completa y no solo el nombre del proceso, que es su comportamiento predeterminado, por ejemplo:A diferencia de la
ps | grepconstrucción con la que necesita filtrar lagreplínea o usar trucos de patrones,pgrepsimplemente no se seleccionará por diseño.Además, si su patrón aparece en la
psUSERcolumna, obtendrá procesos no deseados en la salida,pgrepno sufrirá este defecto.Si desea detalles completos en lugar de solo los pids, puede usar:
que es más simple y más confiable que
o
fuente
-a(--list-full) si desea ver la línea de comando completa y no solo el pid. (El pgrep más viejo no tenía-a, hizo esto-fl.)pgrepde jugar bien la solución. +1/proc/self/cmdlinepara ser "descriptivos",pgrep -fa rubyno coincidirán, por ejemplo.puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker], mientras que el "tonto" lopgrep -a rubyhará. No estoy seguro si este último también puede ser engañado.pgrepyps.fuente
En este momento,
psdará una salida más completa que lapgep -fpgrep se limita a los primeros 4.096 caracteres (a menudo afecta a los usuarios de Java que buscan la clase de entrada de un programa Java con una ruta de clase larga). El seguimiento del error es: https://gitlab.com/procps-ng/procps/issues/86fuente