sha*_*ant 4 command-line shell bash process
我在 BASH 中做了以下事情:
while true;do bash;done
Run Code Online (Sandbox Code Playgroud)
我写了这个班轮,但一开始我不确定它是否:
但是,我想这是第二种情况,因为一旦我运行了一个班轮,我在提示后不久就回来了,我开始输入退出和另一个退出,退出,退出,退出......但我仍然没有回到主壳。
现在,既然打开了这么多子shell,而且每个子shell都是一个程序,我想每个子shell都应该有自己的PID。
所以我做了:
ps aux | grep bash
Run Code Online (Sandbox Code Playgroud)
希望看到很多名称中带有 bash 的进程。
然而,没有像这样的,只有两个 bash shell。
怎么可能,我想我在某个地方对进程、外壳、子外壳和 PID 有一个非常错误的想法,但不知道在哪里。
您的循环正在启动无数个 shell,但一个接一个,而不是并行。循环第一次运行时,它会运行bash,这会启动一个新的 shell 并显示提示。父 shell 等待该 shell 退出;当您键入exit,退出子外壳并返回到父外壳时会发生这种情况,父外壳会再次循环并运行bash,这会启动一个新外壳并显示提示...
您可以通过运行来显示您的 shell 级别
echo $SHLVL
Run Code Online (Sandbox Code Playgroud)
当您键入连续exit命令时,您会看到此数字不会更改。
您的循环在每次迭代中启动一个交互式 shell 会话。
交互式会话为您提供提示(因为它是交互式的)。退出它会将控制权交还给循环,从而启动另一个交互式 shell。
这就是为什么您不会一次获得大量bash进程,只有两个,运行循环的父进程和为您提供新提示的子进程。
循环也可以写成
while true; do bash; done
Run Code Online (Sandbox Code Playgroud)
该true实用程序不接受参数,它只返回一个零退出值,该值被 shell 解释为“真”。
如果你想要一个bash进程的爆炸(所谓的“分叉炸弹”),你可能已经写了
while true; do { bash & }; done
Run Code Online (Sandbox Code Playgroud)
这将bash在循环的每次迭代中启动一个交互式会话,但作为后台进程。由于会话是作为后台进程启动的,循环不会等待最新bash进程完成后再开始下一个进程。
您可能必须重新启动系统才能从中恢复。
这种分叉炸弹比它可能的更温和,因为它在每次迭代中只启动一个新进程。其他人很可能以指数方式启动流程。