
我想知道是否有一種方法可以追蹤 Linux 中命令的運行位置。
例如,如果我呼叫腳本,是否有任何方法可以追蹤它的呼叫位置,例如從程式或另一個 bash 腳本啟動。
答案1
如果你的腳本是用bash寫的,那麼有一個名為$PPID(我猜是父進程ID的縮寫)的內建變量,你可以用它來找出誰呼叫了你的腳本。這是一個例子:
CALLER=$(ps ax | grep "^ *$PPID" | awk '{print $NF}')
echo I was called from $CALLER
解釋:
- $PPID 給予父程序(呼叫者)的程序 ID
- 這附註命令列出所有進程
- 這grep指令尋找在行開頭包含 PPID 的行
- 這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/
“目錄”以獲取更詳細的資訊。