Bash

為什麼這個無限循環不會耗盡我的系統資源?

  • May 13, 2017

我在 BASH 中做了以下操作:

while true;do bash;done

我寫了這個襯裡,但一開始我不確定它是否:

  • 停留在主 shell 中,並在記憶體或其他一些東西耗盡時生成盡可能多的子 shell。
  • 主殼產生一個子殼,而不是這個子殼產生一個子殼,直到這個譜系耗盡記憶體或其他一些東西。

但是,我想這是第二種情況,因為一旦我執行了一個班輪,我在提示回來後不久就得到了,我開始輸入 exit 和另一個 exit 然後 exit,exit,exit ……我仍然沒有回來主殼。

現在,既然已經打開了這麼多子shell,而且每個子shell都是一個程序,我認為每個子shell都應該有自己的PID。

所以我做了:

ps aux | grep bash

期待看到很多名稱中帶有 bash 的程序。

然而,不是這樣的,只有兩個 bash shell。

怎麼可能,我想我在某個地方對程序、shell、子shell和 PID 有一個非常錯誤的想法,但不知道在哪裡。

您的循環在每次迭代中啟動一個互動式 shell 會話。

互動式會話為您提供提示(因為它是互動式的)。退出它會將控制權返回給循環,從而啟動另一個互動式 shell。

這就是為什麼您不會一次獲得大量bash程序,只有兩個,執行循環的父程序和為您提供新提示的子程序。


循環也可以寫成

while true; do bash; done

true實用程序不帶參數,它只返回一個零退出值,shell 將其解釋為“真”。


如果您想要程序爆炸bash(所謂的“fork-bomb”),您可能已經寫了

while true; do { bash & }; done

bash這將在循環的每次迭代中啟動一個互動式會話,但作為後台程序。由於會話是作為後台程序啟動的,因此循環不會bash在開始下一個程序之前等待最新程序完成。

您可能必須重新啟動系統才能從中恢復。

這種分叉炸彈比它可能的更溫和,因為它在每次迭代中只啟動*一個新過程。*其他人可能會以指數方式開始流程。

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