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


13

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

Answers:


13

获取进程的二进制位置的一种方法是在第一个段中使用lsof和。例如,在外壳程序中查看外壳程序是什么二进制文件,请使用外壳程序的PID代替。greptxt$$

$ 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

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

$ sleep 1234567

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


通过awk输配lsof输出效果很好,仅需少量增加即可。我; exit在print语句之后添加了代码,这样txt即使bash示例中有多个条目,也只会打印第一个条目。
qqx 2015年

2

示例:您在为PID 45109...添加关联进程命令名称后

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

2
如果仅按名称启动二进制文件而不指定路径,则不会显示完整的二进制文件路径。
grigoryvp

如果路径包含空格,则无法正常工作
Peter Lapisu


1

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.