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


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


10
2018-05-28 06:01






答案:


获取进程的二进制位置的一种方法是使用 lsof 和 grep 为了第一 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

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

$ 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


10
2018-05-28 06:13



lsof -p显示完整路径,谢谢! - grigoryvp
通过awk管道lsof输出很好,只有一个小的补充。我补充道 ; exit 在print语句之后,只有第一个 txt 即使bash示例中有多个,也会打印条目。 - qqx


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

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

2
2018-05-28 06:13



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


尝试 ps aux


1
2018-05-28 06:13





ps -ef with 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命令)


1
2018-05-28 07:27





ps -p <pid> -Ocommand

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

1
2018-05-29 16:30