Background-Process
如何檢測和停止在後台呼叫自身並退出的腳本
我正在為一個工具編寫一個包裝腳本。包裝腳本應該準備環境,然後在後台呼叫該工具然後退出。它看起來像這樣:
#!/bin/bash export FOO=1 tool "$@" &
這裡沒有什麼了不起的。除了我錯誤地沒有呼叫該工具(/usr/bin/tool),而是有效地呼叫了包裝腳本本身(~/bin/tool)。我在不知不覺中執行了包裝腳本,但什麼也沒發生。至少沒有什麼可見的。
我想知道為什麼什麼也沒發生。再次打開腳本。查看錯誤(不呼叫 /usr/bin/tool)。修復它以執行實際工具並保存。突然,工具彈出。經過一番思考,我意識到包裝腳本一遍又一遍地在後台執行。當我編輯腳本以呼叫實際工具時,腳本的下一次呼叫立即呼叫該工具並停止鏈。
因為它不分叉,所以它不是分叉炸彈。但它似乎是一個遞歸幽靈。我重新創建了靜默遞歸包裝器並嘗試檢測。我的知識有限。我不是大師。我嘗試了 ps 和 pgrep 之類的工具。我給腳本取了一個好聽的名字給 pgrep。但是 pgrep 大多數時候什麼都看不到。在循環中執行 pgrep 有時會擷取失控的腳本。大約每十秒一次?我沒有做統計。
遞歸幽靈腳本是良性的。幾乎不吃任何資源。也許唯一可見的效果是它導致 PID 快速升高。因為每個新的呼叫都會獲得一個新的 PID。
如何檢測和停止在後台呼叫自身並退出的失控遞歸幽靈腳本?
以下是如何重現:
woop
創建使用以下內容呼叫的腳本#!/bin/sh ./woop &
- 打開兩個終端並在文本編輯器中打開腳本
- 在一個終端執行
./woop
。注意沒有任何可見的事情發生。它會立即返回提示。- 在第二個終端執行
while true; do pgrep -fa woop; done
。每十秒左右看到一個結果。- 在文本編輯器中將行更改
./woop &
為./woops &
或其他內容並保存。注意第一個終端(./woop: line 2: ./woops: No such file or directory
)中的錯誤- 在第二個終端通知不再找到任何結果。
使用
forkstat
if available 應該可以很好地指示是否有任何程序執行異常。例如:forkstat -e fork
確定後執行以下一項或全部操作:
chmod -x /path/to/file
mv ...
rm ...
可選擇使用
-S
標誌(此處為簡化統計資訊):$ forkstat -S ... loads of lines ^C Fork Exec Exit ... Total Process 11546 11532 11547 ... 34625 /bin/bash - ./woop ...
有關的: