Назад | Перейти на главную страницу

Как получить информацию о пути из идентификатора процесса?

Чтобы увидеть путь запущенного процесса 25014, я делаю в Linux следующее:

  ls -l /proc/25014/exe

Вывод:

 lrwxrwxrwx 1 root root 0 Mar  9 16:35 /proc/25014/exe -> /etc/syscconfig

Если у нас ОС Solaris. Какая же концепция на Солярисе? В Solaris у нас нет exe-файла.

Самый прямой эквивалент Solaris: /proc/<pid>/path/a.out Например:

% ls -l /proc/$$/path/a.out
lrwxrwxrwx   1 alanc    staff          0 Mar 13 21:16 /proc/2892/path/a.out -> /usr/bin/tcsh*

Я - АВТОР, И ЭТОТ ОТВЕТ НЕПРАВИЛЬНЫЙ И СЛЕДУЕТ УДАЛИТЬ (удалить нельзя, так как это принятый ответ). Как указано в комментариях ниже, он вернет рабочий каталог процесса, также известный как текущий каталог. Если сам процесс не изменил свой рабочий каталог, тогда это будет каталог, из которого был запущен процесс, а не каталог исполняемого файла. Итог: этот ответ неверен в контексте вопроса.


Вот один из способов сделать это.

В Solaris вы должны использовать pargs -ae <pid> команда для этого.

Строка, которая говорит argv[0]: сообщит вам, какой исполняемый файл запущен. Однако этого недостаточно, поскольку вы не знаете текущий каталог этого процесса, когда он был запущен, поэтому, если arg0 не полностью определен, у вас нет полный путь к запущенному приложению. Не бойся. Посмотрите дальше в выходных данных приведенной выше команды и в выходных данных переменных среды процесса найдите PWD. Объедините два, и вы получите полный путь к исполняемому файлу.

Вот пример вывода из pargs -ae команда:

8200:   ./sshd
argv[0]: ./sshd

envp[0]: LANG=C
envp[1]: LC_ALL=
envp[2]: LC_COLLATE=
envp[3]: LC_CTYPE=
envp[4]: LC_MESSAGES=
envp[5]: LC_MONETARY=
envp[6]: LC_NUMERIC=
envp[7]: LC_TIME=
envp[8]: PATH=/usr/sbin:/usr/bin
envp[9]: PWD=/usr/lib/ssh
envp[10]: SHLVL=2
envp[11]: SMF_FMRI=svc:/network/ssh:default
envp[12]: SMF_METHOD=start
envp[13]: SMF_RESTARTER=svc:/system/svc/restarter:default
envp[14]: SMF_ZONENAME=myhost1
envp[15]: TZ=localtime
envp[16]: A__z="*SHLVL