我在 Internet 上以及 Unix 和 Linux 上发现了许多线程,以及有关查找进程路径的堆栈溢出帖子,到目前为止,我还没有成功应用任何方法。
我一直陷入proftpd
展示而不是拥有一条道路。我终于阅读了man ps
AIX 并发现了这一点:
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)
根本没有符号链接。
好的,这是我对我的问题的回答。
第一:我可以假设 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)
我承认这种方法有点复杂,但这是迄今为止我发现的唯一一种“易于编写脚本”的方法。如果有人写过剧本,我很乐意阅读。