Path

如何在 AIX 5 或更高版本上使用其 PID 辨識可執行路徑

  • February 17, 2021

在 AIX 5 或 6 上,ps -ef 隨機顯示執行檔的完整路徑。為什麼?以及如何確定?

我在整個 Internet 以及 Unix 和 Linux 上發現了許多執行緒,以及關於查找程序路徑的堆棧溢出文章,到目前為止,我還沒有成功應用任何方法。

我不斷陷入proftpd展示而不是路徑。我終於閱讀了man psAIX 並找到了這個:

命令

(-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是我找到的第一個輸入whereisasroot嗎?

就我而言:

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>

我承認這種方法有點複雜,但它是迄今為止我發現的唯一一種“易於編寫腳本”的方法。如果有人寫過腳本,我很樂意閱讀。

引用自:https://unix.stackexchange.com/questions/109175