Background-Process

如何檢測和停止在後台呼叫自身並退出的腳本

  • July 5, 2021

我正在為一個工具編寫一個包裝腳本。包裝腳本應該準備環境,然後在後台呼叫該工具然後退出。它看起來像這樣:

#!/bin/bash
export FOO=1
tool "$@" &

這裡沒有什麼了不起的。除了我錯誤地沒有呼叫該工具(/usr/bin/tool),而是有效地呼叫了包裝腳本本身(~/bin/tool)。我在不知不覺中執行了包裝腳本,但什麼也沒發生。至少沒有什麼可見的。

我想知道為什麼什麼也沒發生。再次打開腳本。查看錯誤(不呼叫 /usr/bin/tool)。修復它以執行實際工具並保存。突然,工具彈出。經過一番思考,我意識到包裝腳本一遍又一遍地在後台執行。當我編輯腳本以呼叫實際工具時,腳本的下一次呼叫立即呼叫該工具並停止鏈。

因為它不分叉,所以它不是分叉炸彈。但它似乎是一個遞歸幽靈。我重新創建了靜默遞歸包裝器並嘗試檢測。我的知識有限。我不是大師。我嘗試了 ps 和 pgrep 之類的工具。我給腳本取了一個好聽的名字給 pgrep。但是 pgrep 大多數時候什麼都看不到。在循環中執行 pgrep 有時會擷取失控的腳本。大約每十秒一次?我沒有做統計。

遞歸幽靈腳本是良性的。幾乎不吃任何資源。也許唯一可見的效果是它導致 PID 快速升高。因為每個新的呼叫都會獲得一個新的 PID。

如何檢測和停止在後台呼叫自身並退出的失控遞歸幽靈腳本?

以下是如何重現:

  1. woop創建使用以下內容呼叫的腳本
#!/bin/sh
./woop &
  1. 打開兩個終端並在文本編輯器中打開腳本
  2. 在一個終端執行./woop。注意沒有任何可見的事情發生。它會立即返回提示。
  3. 在第二個終端執行while true; do pgrep -fa woop; done。每十秒左右看到一個結果。
  4. 在文本編輯器中將行更改./woop &./woops &或其他內容並保存。注意第一個終端(./woop: line 2: ./woops: No such file or directory)中的錯誤
  5. 在第二個終端通知不再找到任何結果。

使用forkstatif 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
...

有關的:


引用自:https://unix.stackexchange.com/questions/656999