How do I get the path of a process in Unix / Linux How do I get the path of a process in Unix / Linux unix unix

How do I get the path of a process in Unix / Linux


On Linux, the symlink /proc/<pid>/exe has the path of the executable. Use the command readlink -f /proc/<pid>/exe to get the value.

On AIX, this file does not exist. You could compare cksum <actual path to binary> and cksum /proc/<pid>/object/a.out.


You can find the exe easily by these ways, just try it yourself.

  • ll /proc/<PID>/exe
  • pwdx <PID>
  • lsof -p <PID> | grep cwd


A little bit late, but all the answers were specific to linux.

If you need also unix, then you need this:

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;}

EDITED: Fixed the bug reported by Mark lakata.