Respuestas:
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 ejecutableps 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.plpgrep 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
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: P
pgrepno 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 pgreppor eso. El uso ps aux | grep xxxno es confiable, por lo que es necesario que los piratas se filtren grepdesde la salida y podrían dar falsos positivos como con ps aux | grep root.
El ps aux | grep xcomando da "mejores" resultados que pgrep xesencialmente porque le falta una opción con este último.
Simplemente use la -fopción para pgrepbuscar 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 | grepconstrucción con la que necesita filtrar la greplínea o usar trucos de patrones, pgrepsimplemente no se seleccionará por diseño.
Además, si su patrón aparece en la ps USERcolumna, obtendrá procesos no deseados en la salida, pgrepno 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 .)
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" lo pgrep -a rubyhará. No estoy seguro si este último también puede ser engañado.
pgrepy ps.
diff <(ps aux|grep x) <(pgrep x) # :)
En este momento, psdará una salida más completa que la pgep -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/86