追蹤 linux bash 調用

追蹤 linux bash 調用

我想知道是否有一種方法可以追蹤 Linux 中命令的運行位置。

例如,如果我呼叫腳本,是否有任何方法可以追蹤它的呼叫位置,例如從程式或另一個 bash 腳本啟動。

答案1

如果你的腳本是用bash寫的,那麼有一個名為$PPID(我猜是父進程ID的縮寫)的內建變量,你可以用它來找出誰呼叫了你的腳本。這是一個例子:

CALLER=$(ps ax | grep "^ *$PPID" | awk '{print $NF}')
echo I was called from $CALLER

解釋:

  1. $PPID 給予父程序(呼叫者)的程序 ID
  2. 附註命令列出所有進程
  3. grep指令尋找在行開頭包含 PPID 的行
  4. awk指令僅列印最後一列,即呼叫者的姓名

答案2

曾是我認為“運行自”相當困難,除非運行的可執行檔中有一些日誌記錄。

如果它正在執行時,您可以透過簡單地使用ps.

答案3

如果進程仍在運行,則您可以使用該ps命令提供的分層視覺化(也稱為森林或進程樹)。

嘗試例如:

ps xf

輸出將如下所示:

 3627 ?        Ss     0:00 /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
 3655 ?        S      0:38  \_ bwm --interface eth0 --download
 3656 ?        S      0:38  \_ bwm --interface eth0 --upload
 3687 ?        S      0:20  \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
  574 ?        S      0:00  |   \_ sleep 1
 3713 ?        S      0:00  \_ wmiir read /event
 3714 ?        S      0:00  \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
22671 ?        S      0:00      \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
22672 ?        Ss     0:03          \_ xterm
22673 pts/0    Ss+    0:00              \_ bash

答案4

Hai Vu 的答案可能升級:

ps -p $PPID -o args=

限制-p的是ps父進程 ID 的輸出。允許-o您指定自己的輸出,在本例中我有args=(對我來說給了我我正在尋找的東西)。可能的升級是,您只需詢問ps您想要的信息,而不是獲取大量信息然後嘗試解析它。

獲得後,$PPID您還可以查看/proc/$PPID/“目錄”以獲取更詳細的資訊。

相關內容