20

我知道我可以PID通过 using 来获取进程ps,但是如何找到该进程的完整路径?

4

4 回答 4

19

OS X 有 libproc 库,可用于收集不同的进程信息。为了找到给定 PID 的绝对路径,可以使用以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <libproc.h>

int main (int argc, char* argv[])
{
    pid_t pid; int ret;
    char pathbuf[PROC_PIDPATHINFO_MAXSIZE];

    if ( argc > 1 ) {
        pid = (pid_t) atoi(argv[1]);
        ret = proc_pidpath (pid, pathbuf, sizeof(pathbuf));
        if ( ret <= 0 ) {
            fprintf(stderr, "PID %d: proc_pidpath ();\n", pid);
            fprintf(stderr, "    %s\n", strerror(errno));
        } else {
            printf("proc %d: %s\n", pid, pathbuf);
        }
    }

    return 0;
}

编译和运行示例(上面的代码存储在 pathfind.c 中,32291 是我试图为其查找路径信息的进程的 pid):

$ cc pathfind.c -o pathfind
$ ./pathfind 32291
proc 32291: /some/path/your-binary-app

参考这篇博文: http: //astojanov.wordpress.com/2011/11/16/mac-os-x-resolve-absolute-path-using-process-pid/

于 2013-02-11T04:37:13.857 回答
13

一种解决方案可以使用:

which `ps -o comm= -p $PID`

其中 $PID 是您要检查的进程的 pid。在 OS X 10.8.2 上测试。

于 2013-02-11T04:40:47.890 回答
-1

@tomis 答案的更便携和现代版本:

command -v "$(ps -o comm= -p $PID)"

command -v取代which并且更便携。

反引号替换为$(cmds)

另一个依赖于realpathGNU CoreUtils 的替代方案:

realpath /proc/$PID/exe
于 2020-10-09T11:19:03.847 回答
-7

尝试这个:

sudo ls -l /proc/$(ps -e | grep $PROCESS_NAME | awk '{print $1}')/exe

其中 $PROCESS_NAME 是您要检查的进程的名称。

于 2013-02-11T04:44:23.400 回答