rah*_*huL 7 linux shell bash rhel fork
我设置了 test VM 来测试 fork 炸弹的效果。所以我limits.conf为root用户编辑了以下内容:
root hard nproc 512
Run Code Online (Sandbox Code Playgroud)
现在我像这样放下一个叉子炸弹:
:(){ :|:& };:
Run Code Online (Sandbox Code Playgroud)
在此之后,一段时间后(我相信达到 512 限制需要),出现以下错误:

这继续没有停止。有没有办法在不重新启动机器的情况下停止这个?
有什么办法可以在不重新启动机器的情况下停止此操作吗?
这并非完全不可能,您可以通过运气来做到这一点——也就是说,您可以在另一个进程产生之前设法杀死所有进程。1 但是你必须非常非常幸运,所以这不是一个可靠或值得的努力[也许slm在这里比我幸运,哈哈——说实话,我还没有那么努力]。如果您考虑优先级,您的机会可能会提高(请参阅参考资料man nice),尽管我怀疑这也会影响叉子炸弹的功效。
更好的想法可能是使用超时的方法。有关 C 语言的示例,请参阅我的答案的脚注 5 。2 您可以使用 shell 脚本执行相同的操作,尽管不会那么短:(){ :|:& };::
#!/bin/bash
export fbomb_duration=$1
export fbomb_start=$(date +%s)
go () {
now=$(date +%s)
if [[ $(($now-$fbomb_start)) -gt $fbomb_duration ]]
then exit 0;
fi
go &
}
while ((1)); do
go
done
Run Code Online (Sandbox Code Playgroud)
使用一个参数执行该操作,秒数。在那之后所有的分叉都会消失。
1事实上,如果内核 OOM 杀手运气好的话,最终它可能会自行发生。但不要屏住呼吸。
2用于限制特定炸弹的方法(通过设置vm.overcommit_memory=2)几乎肯定不会在一般情况下起作用,但您可以尝试。我不是,因为我想让我的系统暂时保持运行;)