如何获取pgrep以显示完整的过程信息


26

有什么办法可以pgrep向我提供有关每个流程的所有信息ps?我知道我可以ps通过管道进行grep输入,但是输入的内容很多,这也给了grep我不需要的流程本身。

Answers:


22

pgrep的输出选项非常有限。您几乎肯定需要将其发送回去,ps以获取重要信息。您可以通过在Windows中使用bash函数来自动执行此操作~/.bashrc

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

然后用调用命令。

ppgrep <pattern>

2
谢谢!我将其修改为:function ppgrep() { pgrep "$@" | xargs ps fp 2> /dev/null; } 否则,如果没有进程与您的搜索匹配,它将转储整个ps使用情况。
JoelFan 2010年

在OS X上,ps标志需要连字符:function ppgrep() { pgrep "$@" | xargs ps -fp 2> /dev/null; }
Erik Nomitch 2015年

1
如果要避免使用ps,请使用GNU xargs选项,-r该选项仅在收到列表后才执行命令。
Doug

1
更简洁的方法是ps fp $(pgrep -d, "$@")
Igor Mikushkin

14

结合pgrepps使用xargs

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

例如尝试

pgrep -u user | xargs ps -f -p

以获得的完整进程列表user

保留第一行与列名是很好的。grep总是删除列名。


优秀!这解决了xfvb的arcgis服务器启动脚本的奇怪问题
prusswan 2014年

这应该是一个可以接受的答案,因为它以适当的方式使用unix管道,从一个工具中获取PID列表,然后反馈给另一个工具(如果看起来像黑客一样,则不是-该技术可以在UNIX工具的LOTS中使用) ,例如电子邮件grep工具。Bash函数ppgrep()是不必要的依赖项,并且避免遇到此处介绍的学习机会。)
Scott Prive

10

以下仅给您PID +完整的命令行。对于“所有信息ps都可以”,请参见其他答案...

大多数Linux使用procps-ng。自3.3.4(2012年发布)以来,pgrep -a--list-full)显示完整的命令行。
注意:默认情况下,pgrep只将您提供的模式与可执行文件名相匹配。如果要与完整的命令行匹配(如grepping ps一样),请添加-f--full)选项。

在较旧的版本(包括原始的procps项目)中,-loption显示信息,但其行为有所不同:

不知道* BSD使用什么代码,但是其手册页记录了旧的-fl行为。

不幸的是,您甚至不能随便使用-fl-在最近的procps-ng中,-f--list-name)始终仅打印可执行文件名称。


4

的Linux

用于GNU版本的pgrep-i(不区分大小写)不被支持,并且长+模糊输出与实现-af

$ pgrep -af apache

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

手册页

   -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.

苹果系统

在OSX上(通过推论,在BSD上)-l长输出)与-f与完整参数列表匹配)结合使用将显示完整的命令(-i不区分大小写):

$ pgrep -fil ssh

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

手册页

 -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.

1

使用-v选项进行grep-它返回所有内容,但返回请求的模式。

ps -ef | grep <process> | grep -v grep

这是对我最好的答案。它显示完整的命令不被截断,因为它与发生pgrep -u user | xargs ps -f -p
BringBackCommodore64

0

我认为没有,通过使用pgrep的-l选项可以获得的最多信息是名称和进程ID。

ps支持各种格式设置选项,因此我只是为要保存的键入内容起一个别名。从输出中排除grep进程的一种简单方法是添加一条额外的管道grep -v grep以排除任何grep进程。


0

为了消除此grep过程,您可以将方括号用作模式的一部分:

ps -ef | grep '[t]ty'

您可以使用ps和完成此操作pgrep

ps -fp $(pgrep -d, tty)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.