如何在 AIX 5 或更高版本上使用其 PID 辨識可執行路徑
在 AIX 5 或 6 上,
ps -ef
隨機顯示執行檔的完整路徑。為什麼?以及如何確定?我在整個 Internet 以及 Unix 和 Linux 上發現了許多執行緒,以及關於查找程序路徑的堆棧溢出文章,到目前為止,我還沒有成功應用任何方法。
我不斷陷入
proftpd
展示而不是路徑。我終於閱讀了man ps
AIX 並找到了這個:命令
(-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
對於
httpd
守護程序,它確實顯示了完整路徑,但不顯示proftpd
. 第一個問題是為什麼有些程序顯示有完整路徑而有些沒有?第二個問題是針對這種情況的:
我可以假設 the 的路徑
proftpd
是我找到的第一個輸入whereis
asroot
嗎?就我而言:
whereis proftpd proftpd: /etc/proftpd.conf /usr/sbin/proftpd
所以我假設正在執行的守護程序是
/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
根本沒有符號連結。
好的,這是我對我的問題的回答。
- 第一:我可以假設 proftpd 的路徑是第一個我會發現輸入 whereis as root 的路徑嗎?
==>不,至少以我的經驗,它沒有顯示確定程序可執行路徑的可靠資訊。
- 第二:如何確定正在執行的程序的可執行路徑?
我發現了一個說明這種可能性的stackoverflow主題,這是迄今為止唯一一個向我展示了正確答案的主題:
svmon -P <PID> -O format=nolimit,filename=on,filtertype=client
此命令的問題是您必須等到它向您顯示您想要的資訊,但它可能會在之後給您答案一會兒。另一個問題是,這種方法不能在腳本中使用。
- 第三: 關於“為什麼
ps -ef
既不顯示完整路徑也不顯示相對路徑”答案可能是(但請隨時糾正我)它顯示了使用者鍵入的實際命令,因此如果
root
在包含proftpd
然後它的文件夾中顯示proftpd
到目前為止不知道。
這是迄今為止我能想到的最好的答案。
編輯 1:
查找正在執行的執行檔路徑的腳本化方法(此方法不是來自我,而是來自不再線上的論壇)。請注意,我不會提供腳本,因為它超出了我的能力範圍,而且我現在沒有時間。
- 第一步是獲取可執行二進製文件的 inode
ls -i /proc/<PID>/object/a.out | cut -f 1 -d " "
該命令將輸出一個數字。
- 然後,您需要確定文件所在的設備,然後查看該命令:
ls -li /proc/<PID>/object/ | egrep "<inode>$"
這個命令同時給你一個像這樣的文件名:
jfs2.51.3.<inode>
.jfs2
是文件系統類型,51
主要設備號和3
次要設備號。
- 辨識設備資訊後,我們需要使用以下命令辨識文件所在的塊設備:
ls -l /dev/ | egrep "^b.*51, *3.+$"
^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
- 您現在知道需要在哪裡搜尋您的號碼:
find /opts -inum <inode>
我承認這種方法有點複雜,但它是迄今為止我發現的唯一一種“易於編寫腳本”的方法。如果有人寫過腳本,我很樂意閱讀。