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 pgrep
solo 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 php5
no 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 python
solo 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>/stat
pero no de/proc/<pid>/cmdline
. OK, @Thorsen, ganas el repelente de insectos, es un error: Ppgrep
no 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 culparlopgrep
por eso. El usops aux | grep xxx
no es confiable, por lo que es necesario que los piratas se filtrengrep
desde la salida y podrían dar falsos positivos como conps aux | grep root
.El
ps aux | grep x
comando da "mejores" resultados quepgrep x
esencialmente porque le falta una opción con este último.Simplemente use la
-f
opción parapgrep
buscar 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 | grep
construcción con la que necesita filtrar lagrep
línea o usar trucos de patrones,pgrep
simplemente no se seleccionará por diseño.Además, si su patrón aparece en la
ps
USER
columna, obtendrá procesos no deseados en la salida,pgrep
no 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
.)pgrep
de jugar bien la solución. +1/proc/self/cmdline
para ser "descriptivos",pgrep -fa ruby
no coincidirán, por ejemplo.puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]
, mientras que el "tonto" lopgrep -a ruby
hará. No estoy seguro si este último también puede ser engañado.pgrep
yps
.fuente
En este momento,
ps
dará una salida más completa que lapgep -f
pgrep 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