如何在 Linux 中獲取正在執行的程序的完整執行檔名
我正在編寫一個腳本,它將使用正在執行的程序的文件名。但是,我無法確定某些程序的完整執行檔名。
最初,我決定查詢 中的
Name
條目/proc/PID/status
(或 中的第二個欄位/proc/PID/stat
)。但是,根據手冊頁,該欄位始終被截斷為 15 個字元,但我需要全名以避免衝突/混淆。這個問題的答案建議使用
/proc/PID/cmdline
,但也有問題。一些程序(例如鉻,電子)對值做了愚蠢/聰明的事情,/proc/PID/cmdline
所以我不能只是在那里拆分數據NULL
並直接獲取手冊頁中建議的程序名稱 - 他們在原始文件中填寫了很多東西argv$$ 0 $$欄位並用空格分隔它們,我不認為僅僅用空格分隔是一個好的選擇,因為路徑/文件名可能包含空格。 當我發現有些腳本(例如 python 腳本)在表單中
/usr/bin/python /path/to/script
而有些在表單中時,這更加複雜/path/to/script
。雖然只要我有那個欄位(沒有上面的卡紙)並手動檢查和拆分,這更容易處理。任何想法如何獲得完整的程序名稱/文件名?名稱是否包含完整路徑並不重要,因為這很容易處理(據我現在所見)。
/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
procfs
在具有 procfs-2 支持標準的平台上,您可以通過以下方式獲得結果:ls -l /proc/<pid>/path/a.out
文件 a.out 是二進製文件絕對路徑的符號連結。
請注意,問題沒有提到 Linux,因此,提供有關此功能如何
procfs
在 procfs 發明者 Roger Faulkner 的原始實現上工作的資訊是有意義的。