在“ps auxwww”输出中获取可执行文件的完整路径

在“ps auxwww”输出中获取可执行文件的完整路径

考虑输出中的以下几行"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

我如何强迫附言将 COMMAND 列中的所有命令扩展为其完全限定路径名?我希望将 login 解析为 /usr/bin/login,将 Bash 解析为 /bin/bash。

有没有相当于进程在 Mac OS X 中?也就是说 - 是否有基于文件的机制可以轻松获取进程信息?

答案1

尝试一下这个:

ps ax-o pid,cmd

您可以根据需要重新格式化它(有关详细信息,请阅读手册页)。

最后,我认为 ps(甚至 cat /proc/*/cmdline)会报告命令的启动方式。因此,如果没有提供完整路径,它将仅显示为“command”,而不是“/path/to/command”。

答案2

首先,进程可以更改 报告的标题ps,因此它本身并不是很可靠。您可以使用“e”标志尝试环境变量。

ps auxwwwe

其中应该有一个内置的‘_’变量,如此处所述。

对于作为 shell 子进程运行的每个命令,sh 将此变量设置为可执行文件的完整路径名,并通过环境将此值传递给该子进程。

这对于 BSD 和 Linux 都适用sh。我相信用户无法覆盖这一点。但是,它的可用性可能取决于用户选择的 shell,这非常糟糕,您的里程可能会有所不同。


OS X 没有原生的 procfs。有一个基于保险丝详情可参阅这里. 同样,您的里程可能会有所不同。

答案3

这些引用/proc/<pid>/exe是正确的,但ps不能可靠地提供 exe 路径。此示例提供了某些用户的 PID 和二进制路径列表。请注意,这可能是 Linux 特有的,因为我没有 OSX 系统可以测试:

# pgrep -u USER | while read a; do echo -n "$a "; readlink /proc/$a/exe; done
2439 /usr/bin/gnome-keyring-daemon
2442 /usr/bin/mate-session
2470 /usr/bin/dbus-launch
2471 /usr/bin/dbus-daemon
2481 /usr/bin/ssh-agent
2510 /usr/libexec/dconf-service
2520 /usr/libexec/mate-settings-daemon
2528 /usr/bin/marco
2532 /usr/bin/mate-panel
2537 /usr/libexec/gvfsd
2542 /usr/libexec/gvfsd-fuse
2554 /usr/bin/pulseaudio

答案4

从中提取所有进程 ID 和完整路径/进程

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

相关内容