我正在編寫一個腳本,它將使用正在運行的進程的檔案名稱。但是,我無法確定滿的某些進程的可執行檔名稱。
最初,我決定查詢Name
中的條目/proc/PID/status
(或 中的第二個欄位/proc/PID/stat
)。然而,根據線上說明頁,該字段始終被截斷為 15 個字符,但我需要全名以避免衝突/混淆。
的一個答案這個問題建議使用/proc/PID/cmdline
,但也存在問題。一些程式(例如鉻,電子)對其中的值做了愚蠢/聰明的事情,/proc/PID/cmdline
所以我不能只是分割那裡的數據NULL
並直接獲取聯機幫助頁中建議的程序名稱 - 它們在原始內容中填寫了很多東西argv [0] 欄位並用空格分隔它們,我認為僅僅用空格分割不是一個好的選擇,因為路徑/檔名可能包含空格。
當我發現有些腳本(例如 python 腳本)在 form 中,/usr/bin/python /path/to/script
而有些腳本在 form 中時,這就更加複雜了/path/to/script
。不過,只要我有該欄位(沒有如上所述的堵塞)並手動檢查和拆分,處理起來就容易得多。
有什麼想法如何取得完整的程式名稱/檔案名稱嗎?名稱是否包含完整路徑並不重要,因為這很容易處理(據我現在所見)。
答案1
/proc/$PID/exe
似乎就是您要找的:(proc(5)
/proc/[pid]/exe
在Linux 2.2及更高版本中,該檔案是一個符號鏈接,包含所執行命令的實際路徑名。此符號連結可以正常取消引用;嘗試打開它將打開可執行檔。
所以,簡單來說:
$ /bin/cat & readlink /proc/$!/exe
/bin/cat
它實際上遵循可執行檔的重命名:
/tmp$ cp /bin/cat . ; ./cat & mv cat dog ; readlink /proc/$!/exe
/tmp/dog
答案2
在具有 procfs-2 支援標準的平台上procfs
,您可以透過以下方式獲得結果:
ls -l /proc/<pid>/path/a.out
檔案 a.out 是二進位檔案絕對路徑的符號連結。
請注意,該問題沒有提及 Linux,因此,提供有關此功能如何在procfs
procfs 發明者 Roger Faulkner 的原始實作上工作的資訊是有意義的。