Process

如何在 Linux 中獲取正在執行的程序的完整執行檔名

  • June 17, 2018

我正在編寫一個腳本,它將使用正在執行的程序的文件名。但是,我無法確定某些程序的完整執行檔名。

最初,我決定查詢 中的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 的原始實現上工作的資訊是有意義的。

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