如何在 AIX 5 或更高版本上使用其 PID 识别可执行路径

Kiw*_*iwy 6 ps path aix

在 AIX 5 或 6 上,`ps -ef` 随机显示可执行文件的完整路径。为什么?以及如何确定?

我在 Internet 上以及 Unix 和 Linux 上发现了许多线程,以及有关查找进程路径的堆栈溢出帖子,到目前为止,我还没有成功应用任何方法。
我一直陷入proftpd展示而不是拥有一条道路。我终于阅读了man psAIX 并发现了这一点:

CMD

(-f、-l 和 l 标志)包含命令名称。在 -f 标志下,ps 尝试确定当前的命令名称和参数,这两者都可能被进程异步更改。然后显示这些。否则,将在没有选项 -f 的情况下显示的命令名称写在方括号中。

当我有以下输出时,我想确保理解这意味着什么:

 ps -ef (truncate output)
root 44900     1   0 11:49:36      -  0:00 proftpd: (accepting connections)
nobody 31986 14976   0   13 feb      -  0:00 /usr/local/apache/bin/httpd -f /usr/local/apache/conf/httpd.conf
Run Code Online (Sandbox Code Playgroud)

对于httpd守护程序,它确实显示完整路径,但不显示proftpd. 第一个问题是为什么有些进程显示完整路径而有些没有?

第二个问题是针对这种情况的:

我可以假设 的路径proftpd是第一个我会发现输入whereis为的路径root吗?

就我而言:

 whereis proftpd
 proftpd: /etc/proftpd.conf /usr/sbin/proftpd  
Run Code Online (Sandbox Code Playgroud)

所以我假设正在运行的守护进程是/usr/sbin/protfpd ? 我正确的吗?


编辑2

让我回答那部分:不,我不能做出这样的假设——它根本不相关。我终于发现守护进程正在运行/opt/proftpd,它甚至不在根路径中。

“为什么那样ps -ef工作”仍然是确定的,而且:还有其他方法可以找出知道PID的真实路径是什么?


编辑1:这里是我的AIX系统不支持的证明exe中的链接/proc/<PID>
我针对 AIX 版本 5.3.9.0 和 6.1.7.15 对此进行了测试:

ls -al /proc/44900/*
-rw-------    1 root     nobody            0 14 jan 09:42 /proc/44900/as
-r--------    1 root     nobody          128 14 jan 09:42 /proc/44900/cred
--w-------    1 root     nobody            0 14 jan 09:42 /proc/44900/ctl
lr-x------   53 root     nobody            0 13 jan 16:07 /proc/44900/cwd -> /
-r--------    1 root     nobody            0 14 jan 09:42 /proc/44900/map
-r--r--r--    1 root     nobody          448 14 jan 09:42 /proc/44900/psinfo
-r--------    1 root     nobody         1024 14 jan 09:42 /proc/44900/sigact
-r--------    1 root     nobody         1520 14 jan 09:42 /proc/44900/status
-r--r--r--    1 root     nobody            0 14 jan 09:42 /proc/44900/sysent

/proc/44900/fd:
total 5483376
dr-x------    1 root     nobody            0 14 jan 09:42 .
dr-xr-xr-x    1 root     nobody            0 14 jan 09:42 ..
-r--r--r--    1 root     nobody         5005 12 jul 2004  3
-r--r--r--    1 root     nobody         8655 13 nov 15:13 5
-r--r--r--    1 root     nobody         1607 13 nov 15:12 6
--w-------    1 root     nobody   2378419349 13 jan 16:06 7
--w-------    1 root     nobody    423405131 13 jan 16:06 8

/proc/44900/lwp:
total 0
dr-xr-xr-x    1 root     nobody            0 14 jan 09:42 .
dr-xr-xr-x    1 root     nobody            0 14 jan 09:42 ..
dr-xr-xr-x    1 root     nobody            0 14 jan 09:42 99075

/proc/44900/object:
total 90312
dr-x------    1 root     nobody            0 14 jan 09:42 .
dr-xr-xr-x    1 root     nobody            0 14 jan 09:42 ..
-rwxr-xr-x    1 root     system      1268973 16 okt 2012  a.out
-rwxr-xr-x    1 bin      bin           15265 12 jul 2004  jfs.10.5.12513
-r--r--r--    1 bin      bin         8587637 23 mei 2008  jfs.10.5.16405
-r-xr-xr-x    1 bin      bin         9281793 23 sep 2008  jfs.10.5.4131
-r-xr-xr-x    1 bin      bin           11019 01 okt 2007  jfs.10.5.4149
-r--r--r--    1 bin      bin          162078 19 jun 2008  jfs.10.5.4169
-r--r--r--    1 bin      bin         1161414 23 sep 2008  jfs.10.5.4171
-r--r--r--    1 bin      bin          379513 19 jun 2008  jfs.10.5.4943
-r-xr-xr-x    1 bin      bin           96495 19 jun 2008  jfs.10.5.5248
-rw-r--r--    1 root     system     17160842 05 okt 2011  jfs2.51.3.266241
-rwxr-xr-x    1 root     system       315783 11 mei 2006  jfs2.51.3.266246
-rw-r--r--    1 root     system      3237612 05 okt 2011  jfs2.51.3.266262
-rw-r--r--    1 root     system       125958 25 mrt 2008  jfs2.51.3.270769
-rwxr-xr-x    1 root     system      3140221 20 mei 2011  jfs2.51.3.282757
-rwxr-xr-x    1 root     system      1268973 16 okt 2012  jfs2.51.3.283899
Run Code Online (Sandbox Code Playgroud)

根本没有符号链接。

Kiw*_*iwy 4

好的,这是我对我的问题的回答。

  • 第一:我可以假设 proftpd 的路径是我找到的第一个以 root 身份键入 whereis 的路径吗?
    ==> 不,至少根据我的经验,它没有显示任何可靠的信息来确定进程可执行路径。

  • 第二:如何确定正在运行的进程的可执行路径?
    我发现一个stackoverflow 主题陈述了这种可能性,这是迄今为止唯一向我展示正确答案的主题:
    svmon -P <PID> -O format=nolimit,filename=on,filtertype=client
    此命令的问题是您必须等到它显示您想要的信息,但它可能会在之后给您答案一会儿。另一个问题是,该方法不能在脚本中使用。

  • 第三: 关于“为什么ps -ef既不显示完整路径也不显示相对路径”
    答案可能是(但请随意纠正我)它显示了用户输入的实际命令,因此如果root位于包含该命令的文件夹中proftpd,那么它只会显示proftpd
    到目前为止还不知道。

这是迄今为止我能想到的最好答案。


编辑1

查找正在运行的可执行文件的路径的脚本化方法(此方法不是来自我,而是来自不再在线的论坛)。请注意,我不会提供脚本,因为它超出了我的能力范围,而且我现在没有时间。

  • 第一步是获取可执行二进制文件的索引节点

    ls -i /proc/<PID>/object/a.out  |  cut -f 1 -d " "
    
    Run Code Online (Sandbox Code Playgroud)

    该命令将输出一个数字。

  • 然后您需要确定您的文件所在的设备,然后查看该命令:

    ls -li /proc/<PID>/object/ | egrep "<inode>$"
    
    Run Code Online (Sandbox Code Playgroud)

    该命令同时为您提供如下文件名:jfs2.51.3.<inode>jfs2是文件系统类型、51主设备号和3次设备号。

  • 识别设备信息后,我们需要使用以下命令识别文件所在的块设备:

    ls -l /dev/ | egrep "^b.*51, *3.+$"  
    
    Run Code Online (Sandbox Code Playgroud)

    ^b.*51, *3.+$ ^b用于匹配块设备,
    51, *3匹配主块51后跟一个逗号以及3之前找到的任何空格和次要块号。
    这个命令同时给你类似的东西:
    brw-rw---- 1 root system 51, 3 24 feb 2009 myfilesystem

  • 然后,您可以像这样识别块的安装点:

    df | grep myfilesystem
    /dev/myfilesystem     31457280    144544  100%   107442    81% /opts
    
    Run Code Online (Sandbox Code Playgroud)
  • 您现在知道需要在哪里搜索您的号码:

    find /opts -inum <inode>
    
    Run Code Online (Sandbox Code Playgroud)

我承认这种方法有点复杂,但这是迄今为止我发现的唯一一种“易于编写脚本”的方法。如果有人写过剧本,我很乐意阅读。