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

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

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

答案1

获取进程二进制文件位置的一种方法是使用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

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

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

$ sleep 1234567

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

$ ps auxww|grep '[s]leep'
blair    79462   0.0  0.0   600908    744 s011  S+   11:17PM   0:00.00 sleep 1234567

使用lsof显示它运行了哪个二进制文件:

$ lsof -p 79462 | awk '$4 == "txt" { print $9 }'
/opt/local-development/bin/gsleep

我已经安装了 MacPorts coreutils +with_default_names,这说明我选择了gsleep而不是/bin/sleep

答案2

ps -ef 和 grep 对我来说很管用。对于特定文件名,只需通过 grep 管道输入即可:

MacBook:~ Me$ ps -ef | grep Safari | grep -v grep
  501 15733   301   0   0:25.76 ??         1:58.24 /Applications/Safari.app/Contents/MacOS/Safari -psn_0_4977855

(最后的“grep -v grep”只是阻止您在输出中获取自己的 grep 命令)

答案3

例如:您正在寻找关联进程命令名称PID 45109...

>    % ps awx | awk '$1 == 45109 { print $5 }'
>    /Applications/Safari.app/Contents/MacOS/Safari

答案4

尝试 ps aux

相关内容