如何从进程ID获取路径详细信息?

如何从进程ID获取路径详细信息?

为了查看正在运行的进程 25014 的路径,我在 Linux 上执行以下操作:

  ls -l /proc/25014/exe

输出:

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

假设我们有 Solaris 操作系统。Solaris 上有什么相同的概念?在 Solaris 中,我们没有 exe 文件。

答案1

我是作者,这个答案是错误的,应该删除(不能删除,因为它是可接受的答案)。正如下面的评论所指出的,它将返回进程的工作目录,即当前目录。除非进程本身更改了其工作目录,否则它将是启动进程的目录,而不是可执行文件的目录。底线:这个答案在问题的上下文中是不正确的。


这是实现此目的的一种方法。

在 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

答案2

最直接的 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*

相关内容