如何在 MacOS 中从 PID 获取进程文件名?

gri*_*yvp 13 mac-osx process pid

是否可以使用PID获取进程的文件名?ps 显示了很多关于进程的有用信息,但不显示进程可执行文件位置的提示。

Bla*_*jac 15

获取进程二进制位置的一种方法是使用lsofgrep用于第一个txt段。例如,在 shell 中查看 shell 是什么二进制文件,使用 shell 的 PID 代替$$.

$ lsof -p $$ | grep txt
bash    78228 blair  txt    REG   14,2   1244928   6568359 /bin/bash
bash    78228 blair  txt    REG   14,2   1059792  23699809 /usr/lib/dyld
bash    78228 blair  txt    REG   14,2 136368128  81751398 /private/var/db/dyld/dyld_shared_cache_i386
Run Code Online (Sandbox Code Playgroud)

您可以看到 shell 正在使用/bin/bash.

如果使用绝对或相对路径启动进程,则此技术有效。例如,进入一个 shell 并运行

$ sleep 1234567
Run Code Online (Sandbox Code Playgroud)

ps在另一个 shell 中使用仅显示它是如何启动的:

$ ps auxww|grep '[s]leep'
blair    79462   0.0  0.0   600908    744 s011  S+   11:17PM   0:00.00 sleep 1234567
Run Code Online (Sandbox Code Playgroud)

usinglsof显示它运行的二进制文件:

$ lsof -p 79462 | awk '$4 == "txt" { print $9 }'
/opt/local-development/bin/gsleep
Run Code Online (Sandbox Code Playgroud)

我的MacPorts的coreutils + with_default_names安装,这也解释了,我拿起gsleep并没有/bin/sleep