
如果我有 2 個可執行檔(/path/to/gcc/myapp.exe
、 和/path/to/intel/myapp.exe
),其中一個是使用 intel 編譯器編譯的,另一個是使用標準 gcc 編譯的,則運行這兩個文件將顯示top
為myapp
.如果我運行這兩個並且進程運行為myapp
,有沒有辦法可以找出哪個進程來自哪個可執行檔?
我們的叢集上安裝了一堆應用程序,我不僅對哪些應用程式使用最多感興趣,而且對哪些應用程式感興趣版本正在使用的應用程式。如果我看到 500 次正在R
運行,我想知道其中 100 次是否來自/path/to/R-3.2.1/intel/R
,其他 400 次來自/path/to/R-3.1.3/gcc/R
等等。
答案1
您可以使用/proc
檔案系統來執行此操作,如proc(5)
手冊頁:
/proc/[pid]/exe
在Linux 2.2及更高版本中,該檔案是一個符號鏈接,包含所執行命令的實際路徑名。
因為它是一個符號連結,您可以閱讀目標(執行 anls -l
查看路徑名)。
當然[pid]
意味著您在運行時感興趣的特定可執行檔的進程 ID。
(您的系統不太可能運行那麼舊的 Linux 內核,因此「始終有效」應該足夠好了)。
要獲得計數,您只需要一個腳本來遍歷/proc
您擁有的每個目錄(因為您正在運行程序,您可以看到它們的/proc
資料),並將路徑名與您感興趣的路徑名稱進行匹配。這readlink
例如,program 在 bash 腳本中很有用(並且由於它是 的一部分coreutils
,因此您可能在 Linux 系統上擁有它)。
答案2
為此,您可以啟動top
,然後c
按鍵盤切換完整路徑視圖。
答案3
如果這些進程使用不同的命令列執行(例如使用完整路徑),您可以按c
顯示/隱藏執行該進程的完整命令列。