在ps auxwww输出中获取可执行文件的完整path

考虑"ps auxwww"输出中的以下几行:

 USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND root 4262 0.0 0,1 76592 1104 s005 Ss 10:02am 0:00.03 login -pf yo yo 4263 0.0 0,0 75964 956 s005 S 10:02am 0:00.03 -bash 

问题1:如何强制ps将COMMAND列中的所有命令展开为完全限定的path名​​称? 我想login被parsing到/ usr / bin / login和bash到/ bin / bash。

问题2: MacOS X中是否有与procfs相当的function? 那就是 – 是否有基于文件的机制来轻松获取过程信息?

试试这个:

ps ax -o pid,cmd

您可以根据需要重新格式化它(详情请阅读手册页)。

最后,我认为ps(甚至cat / proc / * / cmdline)会按照启动的方式报告命令。 所以如果没有给出完整的path,它将显示为“命令”而不是“/ path / to / command”。

首先进程可以改变由ps报告的标题,所以它本身不是很可靠。 你可以使用'e'标志来尝试环境variables。

 ps auxwwwe 

在这些内应该是一个内置的'_'variables,如下所述。

对于每个作为shell子项运行的命令,sh都会将此variables设置为可执行文件的完整path名,并将此值通过环境传递给该subprocess。

对于BSD来说,这和Linux一样。 我相信这不能被用户覆盖。 然而,它的可用性可能取决于用户的shellselect,这是非常讨厌和YMMV。


OSX没有一个本地的procfs。 有一个基于FUSE的端口。 详情可以在这里find。 再次YMMV。

停止使用ps并使用cat / proc / pid / cmdline

您可以使用通配符,例如/ proc / * / cmdline。

从/ proc中提取所有进程ID和完整path:

 ls -l /proc/*/exe 2>/dev/null | awk '{print $8 " " $10}'