
有沒有辦法找出哪個程式正在執行我的腳本?
我正在運行 I3 作為我的視窗管理器,我想使用sxkhd
bynd 鍵而不是 i3config,但有些東西不斷取代我的 sxkhd bynds,所以我想追蹤它是什麼。也許我可以使用,strace
但我還沒弄清楚如何使用。
感謝您的解答
編輯:
結果我沒有殺死我的舊sxkhd
進程,所以他們因執行我的腳本而有罪
,但我仍然很好奇如何追蹤這些執行
答案1
$PPID
在 Linux 上,您可以從變數或 /proc/pid/status取得父進程的 PID 。例如,在守護進程的情況下,父進程並不總是呼叫進程,但通常是。話雖如此,您可以將每個程式轉換為包裝器,該包裝器首先將其父進程的 PID 記錄到檔案中,然後執行原始二進位檔案。我不使用 sxkhd,但當您使用 X11 時,讓我們使用 xeyes 作為範例。建立xeyes
包含以下內容的腳本並使其可執行:
#!/usr/bin/env sh
printf "PPID: %d\n" "$PPID" >> /tmp/XEYES_RUN
xeyes.orig "$@"
現在將原始 xeyes 二進位檔案重新命名為 xeyes.orig:
sudo mv "$(command -v xeyes)" "$(dirname $(command -v xeyes))"/xeyes.orig
xeyes
用腳本包裝器替換原來的:
sudo cp ./xeyes "$(dirname $(command -v xeyes.orig))"
正常調用xeyes
:
xeyes
現在,每次執行 xeyes 時,其父進程的 PID 都會被附加到 /tmp/XEYES_RUN 中。如果您從命令列啟動它,它將是您的 shell 的 PID,例如 /bin/bash。
答案2
在 Linux 上,從 shell 中:
readlink "/proc/$PPID/exe"
在任何標準 shell 中,$PPID
變數都指的是父進程。在 C 語言中,您可以使用getppid()
.大多數語言都有一種方法來檢索它(例如,getppid
在 perl、os.getppid
python 等)。
一旦獲得父進程的 PID,將其映射到可執行檔必然是系統特定的。ps
會告訴您進程名稱或命令列參數,但這些是不可靠的,因為它們(通常)不包含完整路徑,並且可以由進程本身或以相同使用者身分執行的任何其他進程進行修改。
在 Linux 上,進程的可執行檔由 指向/proc/<pid>/exe
。這是一個「神奇」的符號連結:即使原始可執行檔被刪除或重新命名,您仍然可以讀取它(例如複製到其他地方)或再次執行它。