如何阻止 Fork Bomb 内存不足错误 - RHEL 6

rah*_*huL 7 linux shell bash rhel fork

我设置了 test VM 来测试 fork 炸弹的效果。所以我limits.confroot用户编辑了以下内容:

root    hard         nproc  512
Run Code Online (Sandbox Code Playgroud)

现在我像这样放下一个叉子炸弹:

:(){ :|:& };:
Run Code Online (Sandbox Code Playgroud)

在此之后,一段时间后(我相信达到 512 限制需要),出现以下错误: 例子

这继续没有停止。有没有办法在不重新启动机器的情况下停止这个?

gol*_*cks 3

有什么办法可以在不重新启动机器的情况下停止此操作吗?

这并非完全不可能,您可以通过运气来做到这一点——也就是说,您可以在另一个进程产生之前设法杀死所有进程。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)几乎肯定不会在一般情况下起作用,但您可以尝试。我不是,因为我想让我的系统暂时保持运行;)