当前位置:  开发笔记 > 运维 > 正文

如何在Unix/Linux中获取进程的路径

如何解决《如何在Unix/Linux中获取进程的路径》经验,为你挑选了5个好方法。

在Windows环境中,有一个API来获取正在运行进程的路径.在Unix/Linux中有类似的东西吗?

或者在这些环境中还有其他方法吗?



1> jpalecek..:

在Linux上,符号链接/proc//exe具有可执行文件的路径.使用该命令readlink -f /proc//exe获取值.

在AIX上,此文件不存在.你可以比较cksum cksum /proc//object/a.out.


`sudo`如果输出为空,则某些进程由其他系统用户创建.

2> hahakubile..:

您可以通过这些方式轻松找到exe,只需自己尝试一下.

ll /proc//exe

pwdx

lsof -p | grep cwd



3> Hiperion..:

有点晚了,但所有的答案都是针对linux的.

如果你还需要unix,那么你需要这个:

char * getExecPath (char * path,size_t dest_len, char * argv0)
{
    char * baseName = NULL;
    char * systemPath = NULL;
    char * candidateDir = NULL;

    /* the easiest case: we are in linux */
    size_t buff_len;
    if (buff_len = readlink ("/proc/self/exe", path, dest_len - 1) != -1)
    {
        path [buff_len] = '\0';
        dirname (path);
        strcat  (path, "/");
        return path;
    }

    /* Ups... not in linux, no  guarantee */

    /* check if we have something like execve("foobar", NULL, NULL) */
    if (argv0 == NULL)
    {
        /* we surrender and give current path instead */
        if (getcwd (path, dest_len) == NULL) return NULL;
        strcat  (path, "/");
        return path;
    }


    /* argv[0] */
    /* if dest_len < PATH_MAX may cause buffer overflow */
    if ((realpath (argv0, path)) && (!access (path, F_OK)))
    {
        dirname (path);
        strcat  (path, "/");
        return path;
    }

    /* Current path */
    baseName = basename (argv0);
    if (getcwd (path, dest_len - strlen (baseName) - 1) == NULL)
        return NULL;

    strcat (path, "/");
    strcat (path, baseName);
    if (access (path, F_OK) == 0)
    {
        dirname (path);
        strcat  (path, "/");
        return path;
    }

    /* Try the PATH. */
    systemPath = getenv ("PATH");
    if (systemPath != NULL)
    {
        dest_len--;
        systemPath = strdup (systemPath);
        for (candidateDir = strtok (systemPath, ":"); candidateDir != NULL; candidateDir = strtok (NULL, ":"))
        {
            strncpy (path, candidateDir, dest_len);
            strncat (path, "/", dest_len);
            strncat (path, baseName, dest_len);

            if (access(path, F_OK) == 0)
            {
                free (systemPath);
                dirname (path);
                strcat  (path, "/");
                return path;
            }
        }
        free(systemPath);
        dest_len++;
    }

    /* again someone has use execve: we dont knowe the executable name; we surrender and give instead current path */
    if (getcwd (path, dest_len - 1) == NULL) return NULL;
    strcat  (path, "/");
    return path;
}

编辑:修正了Mark lakata报道的错误.


请注意,readlink不会终止结果,因此此代码具有未定义的行为.

4> User..:

我用:

ps -ef | grep 786

将786替换为您的PID或进程名称.



5> 小智..:

pwdx

此命令将从执行位置获取进程路径.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有