Cómo hacer que pgrep muestre información completa del proceso

26

¿Hay alguna forma de pgrepdarme toda la información sobre cada proceso que lo pshace? Sé que puede canalizar psa través greppero eso es un montón de escribir y también me da el grepproceso en sí mismo, que no quiero.

JoelFan
fuente

Respuestas:

22

pgrepLas opciones de salida son bastante limitadas. Es casi seguro que tendrá que volver a enviarlo pspara obtener la información importante. Puede automatizar esto usando una función bash en su ~/.bashrc.

function ppgrep() { pgrep "$@" | xargs --no-run-if-empty ps fp; }

Luego llame al comando con.

ppgrep <pattern>
Dan Carley
fuente
2
¡Gracias! Lo modifiqué para: function ppgrep() { pgrep "$@" | xargs ps fp 2> /dev/null; } De lo contrario, si ningún proceso coincide con su búsqueda, psvolcará toda una meguila de uso.
JoelFan
En OS X, psnecesita un guión para las banderas:function ppgrep() { pgrep "$@" | xargs ps -fp 2> /dev/null; }
Erik Nomitch
1
Si desea evitar la página de uso de ps, GNU xargs tiene una opción, -rque solo ejecutará el comando si ha recibido una lista.
Doug
1
La forma más concisa esps fp $(pgrep -d, "$@")
Igor Mikushkin
14

Combinar pgrepcon el psuso xargs!

pgrep <your pgrep-criteria> | xargs ps <your ps options> -p

Por ejemplo, intente

pgrep -u user | xargs ps -f -p

para obtener una lista completa de procesos de user.

Es bueno que mantenga la primera línea con los nombres de las columnas. grepsiempre suelta los nombres de columna.

finalmente
fuente
¡excelente! esto resuelve un problema extraño con el script de inicio del servidor arcgis para xfvb
prusswan
Esta debería ser la respuesta aceptada, ya que utiliza tuberías Unix de manera adecuada, tomando una lista de PID de una herramienta y retroalimentando a otra (si parece piratería informática, no lo es; esta técnica se puede usar en MUCHAS herramientas UNIX) , como las herramientas de correo electrónico grep. La función Bash ppgrep () es una dependencia innecesaria, y evita confrontar la oportunidad de aprendizaje presentada aquí.)
Scott Prive
10

Lo siguiente solo le ofrece PID + línea de comando completa. Para "toda la información ps", vea otras respuestas ...

La mayoría de los linuxes usan procps -ng . Desde 3.3.4 (lanzado en 2012), pgrep -a( --list-full) muestra la línea de comando completa.
Nota: Por defecto, pgrep solo coincide con el patrón que le das al nombre del ejecutable. Si desea hacer coincidir la línea de comando completa (como lo hace grepping ps), agregue la opción -f( --full).

En versiones anteriores (incluido el proyecto procps original ), la -lopción mostraba información pero su comportamiento variaba:

  • pgrep -fl hizo coincidir el patrón con la línea de comando completa y mostró la línea de comando completa.
  • pgrep -lsolo coincidía solo con el nombre del ejecutable y solo mostraba el nombre del ejecutable.
    Si no desea una coincidencia completa, no puede ver la línea de comando completa :-( [ https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=526355#15 ]

No estoy seguro de qué código * BSD usa, pero su página de manual documenta el -flcomportamiento anterior.

Desafortunadamente, ni siquiera puede usarlo de forma -flportátil: en procps-ng reciente, -f( --list-name) siempre imprime solo el nombre del ejecutable.

Beni Cherniavsky-Paskin
fuente
4

Linux

Para la versión GNU de pgrepla -i(insensibilidad a mayúsculas y minúsculas), no se admite la salida larga + difusa con -af.

$ pgrep -af apache

OUTPUT:
    1748 /usr/sbin/apache2 -k start

Página del manual :

   -a, --list-full
       List  the  full  command line as well as the process ID.  (pgrep only.)

   -f, --full
       The pattern is normally only matched against the process name.  
       When -f is set, the full command  line is used.

Mac OS

En OSX (y por inferencia, en BSD) -l( salida larga ) en combinación con -f( coincidencia con listas de argumentos completos ) se mostrará el comando completo ( -iagrega mayúsculas y minúsculas):

$ pgrep -fil ssh

OUTPUT:
    33770 ssh: abc@192.168.0.123-22 [mux] t

La página del manual :

 -l          Long output.  For pgrep, print the
             process name in addition to the
             process ID for each matching
             process.  If used in conjunction
             with -f, print the process ID and
             the full argument list for each
             matching process.  For pkill, dis-
             play the kill command used for
             each process killed.
ccpizza
fuente
1

Use la opción -v para grep: devuelve todo PERO el patrón solicitado.

ps -ef | grep <process> | grep -v grep
Baumgart
fuente
Esta fue la mejor respuesta para mí. Le muestra el comando completo sin ser truncado como sucede conpgrep -u user | xargs ps -f -p
BringBackCommodore64
0

No creo que exista, la mayor cantidad de información que puede obtener es el nombre y la identificación del proceso utilizando la opción -l para pgrep.

ps admite todo tipo de opciones de formato, por lo que solo haría un alias para lo que desea guardar al escribir. Una manera simple de excluir el proceso grep de la salida es incluir una tubería adicional grep -v greppara excluir cualquier proceso grep.

Kyle Brandt
fuente
0

Para eliminar el grepproceso, puede usar paréntesis como parte de su patrón:

ps -ef | grep '[t]ty'

Puedes hacer esto con psy pgrep:

ps -fp $(pgrep -d, tty)
Pausado hasta nuevo aviso.
fuente
-1

Esto te ayudará, supongo:

ps auxww

Blagoy Genadiev
fuente
2
¿Puedes por favor elaborar? Más información mejoraría esta respuesta
Dave M