如何取得 Linux 中正在運行的進程的完整可執行檔名稱

如何取得 Linux 中正在運行的進程的完整可執行檔名稱

我正在編寫一個腳本,它將使用正在運行的進程的檔案名稱。但是,我無法確定滿的某些進程的可執行檔名稱。

最初,我決定查詢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,因此,提供有關此功能如何在procfsprocfs 發明者 Roger Faulkner 的原始實作上工作的資訊是有意義的。

相關內容