Respuestas:
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 ejecutableps 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
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
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: P
pgrep
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 culparlo pgrep
por eso. El uso ps aux | grep xxx
no es confiable, por lo que es necesario que los piratas se filtren grep
desde la salida y podrían dar falsos positivos como con ps aux | grep root
.
El ps aux | grep x
comando da "mejores" resultados que pgrep x
esencialmente porque le falta una opción con este último.
Simplemente use la -f
opción para pgrep
buscar 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 ps | grep
construcción con la que necesita filtrar la grep
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:
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
-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" lo pgrep -a ruby
hará. No estoy seguro si este último también puede ser engañado.
pgrep
y ps
.
diff <(ps aux|grep x) <(pgrep x) # :)
En este momento, ps
dará una salida más completa que la pgep -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/86