Bash
為什麼這個無限循環不會耗盡我的系統資源?
我在 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
在開始下一個程序之前等待最新程序完成。您可能必須重新啟動系統才能從中恢復。
這種分叉炸彈比它可能的更溫和,因為它在每次迭代中只啟動*一個新過程。*其他人可能會以指數方式開始流程。