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

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

获取进程的二进制位置的一种方法是对第一个txt段使用lsofgrep 。 例如,在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

如果使用绝对path或相对path启动该过程,则此技术有效。 例如,进入一个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

例如:您在PID 45109的关联进程命令名PID 45109

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

试试ps aux

ps -ef与grep为我工作。 对于一个特定的文件名,只需简单地通过greppipe道:

 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命令)

ps -p <pid> -O命令

 L1A1:~ a1155344$ ps -p1 -Ocommand PID TT STAT TIME COMMAND 1 ?? Ss 0:02.26 /sbin/launchd