как мне получить путь к процессу в unix/linux

<p>в среде windows есть api для получения пути, по которому выполняется процесс. есть ли что-то подобное в unix/linux?</p><p>или есть какой-то другой способ сделать это в этих условиях?</p>

<p>в linux символьная ссылка <code>/proc/<pid>/exe</code> имеет путь к исполняемому файлу. используйте команду <code>readlink -f /proc/<pid>/exe</code>, чтобы получить значение.</p><p>в aix этот файл не существует. вы можете сравнить <code>cksum <actual path to binary></code> и <code>cksum /proc/<pid>/object/a.out</code>.</p>

<p>вы можете легко найти exe этими способами, просто попробуйте сами.</p><ul> <li><code>ll /proc/<pid>/exe</code></li> <li><code>pwdx <pid></code></li> <li><code>lsof -p <pid> | grep cwd</code></li> </ul>

<p>немного поздно, но все ответы были специфичны для linux.</p><p>если вам нужен также unix, то вам нужно это:</p><pre><code>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; } </code></pre><p><strong> редактирование: </strong>исправлена ошибка, о которой сообщил марк лаката.</p>

<p>я использую:</p><pre><code>ps -ef | grep 786 </code></pre><p>замените 786 на свой pid или имя процесса.</p>

<p><code>pwdx <process id></code></p><p>эта команда будет извлекать путь процесса, из которого она выполняется.</p>

<p>в linux каждый процесс имеет свою собственную папку в <code>/proc</code>. таким образом, вы можете использовать <code>getpid()</code>, чтобы получить pid запущенного процесса, а затем соединить его с путем <code>/proc</code>, чтобы получить нужную папку.</p><p>вот короткий пример на python:</p><pre><code>import os print os.path.join('/proc', str(os.getpid())) </code></pre><p>вот также пример в ansi c:</p><pre><code>#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> int main(int argc, char **argv) { pid\_t pid = getpid(); fprintf(stdout, "path to current process: '/proc/%d/'\n", (int)pid); return exit\_success; } </code></pre><p>скомпилируйте это с:</p><pre><code>gcc -wall -werror -g -ansi -pedantic process\_path.c -oprocess\_path </code></pre>

<p>спасибо : <a href="https://unix.stackexchange.com/questions/109175/how-to-identify-executable-path-with-its-pid-on-aix-5-or-more">киви</a> <br> с aix:</p><pre><code>getpathbypid() { if [[ -e /proc/$1/object/a.out ]]; then inode=ls -i /proc/$1/object/a.out 2>/dev/null | awk '{print $1}' if [[ $? -eq 0 ]]; then strnode=${inode}"$" strnum=`ls -li /proc/$1/object/ 2>/dev/null | grep $strnode | awk '{print $nf}' | grep "[0-9]{1,}.[0-9]{1,}." if [[ $? -eq 0 ]]; then # jfs2.10.6.5869 n1=`echo $strnum|awk -f"." '{print $2}'` n2=`echo $strnum|awk -f"." '{print $3}'` # brw-rw---- 1 root system 10, 6 aug 23 2013 hd9var strexp="^b.*"$n1,"[[:space:]]{1,}"$n2"[[:space:]]\{1,\}.*$" # "^b.10, {1,}5 {1,}.$" strdf=`ls -l /dev/ | grep $strexp | awk '{print $nf}'` if [[ $? -eq 0 ]]; then strmpath=df | grep $strdf | awk '{print $nf}' if [[ $? -eq 0 ]]; then find $strmpath -inum $inode 2>/dev/null if [[ $? -eq 0 ]]; then return 0 fi fi fi fi fi fi return 1 } 

там нет "гарантированно работать в любом месте" метод.шаг 1 - проверить argv [0], если программа была запущена по ее полному пути, у нее (как правило) будет полный путь. если он был запущен по относительному пути, то же самое сохраняется (хотя для этого требуется получить текущий рабочий каталог, используя getcwd ().шаг 2, если ничего из вышеперечисленного не выполняется, состоит в том, чтобы получить имя программы, затем получить имя программы из argv [0], затем получить path пользователя из окружения и пройти через это, чтобы увидеть, есть ли подходящий исполняемый двоичный файл с тем же именем.обратите внимание, что argv [0] устанавливается процессом, исполняющим программу, поэтому он не на 100% надежен.

вы также можете получить путь к gnu/linux с помощью (не полностью протестировано):char file[32]; char buf[64]; pid_t pid = getpid(); sprintf(file, "/proc/%i/cmdline", pid); file f = fopen(file, "r"); fgets(buf, 64, f); fclose(f); если вы хотите, чтобы каталог исполняемого файла, возможно, изменил рабочий каталог на каталог процесса (для носителя/данных/и т.д.), вам нужно удалить все после последнего /:strrchr(buf, '/') = '0'; /chdir(buf);/ 

приведенная ниже команда выполняет поиск имени процесса в списке запущенных процессов и перенаправляет команду pid на pwdx, чтобы найти местоположение процесса.ps -ef | grep "abc" |grep -v grep| awk '{print $2}' | xargs pwdx </code></pre><p>замените «abc» вашим конкретным рисунком.</p><p>в качестве альтернативы, если вы можете настроить его как функцию в .bashrc, вам может пригодиться использование, если вам нужно, чтобы это часто использовалось.</p><pre><code>ps1() { ps -ef | grep "$1" |grep -v grep| awk '{print $2}' | xargs pwdx; } </code></pre><p>например:</p><pre><code>[admin@myserver:/home2/avro/avrogen]$ ps1 nifi 18404: /home2/avro/nifi </code></pre><p>надеюсь, это поможет кому-нибудь когда-нибудь .....</p>