化解叉子炸弹:杀死叉子过程

我想使用docker在shell中执行用户提供的(可能不安全的)代码。 每次运行都应该受到时间的限制,比如10秒。 所以在10秒之后,我想停止命令以及由它制造的所有分支。

我已经使用ulimit -u 30设置了最大进程数的限制,现在forkbomb并没有对系统造成任何损害。

我用id = 1000的用户运行docker,container里的用户id = 3000,所以启动这个命令的用户没有被fork炸弹拦截。

现在我想处理超时。 不幸的是, timeout 10s docker run -u 3000 ... forkbomb不起作用。 我所要做的是杀死用户拥有的所有进程id = 3000,但这些进程无限分叉,我担心killall -KILL -u 3000不会总是工作。 killall不是primefaces的,是吗?

所以,我正在寻找一种方法来杀死一些特定用户拥有的所有进程,即使进程fork。 我发现了一个有以下代码的博客文章 :

 cd /proc; for p in [0-9]*; do read CMDLINE < $p/cmdline; if [[ $CMDLINE == "processWithBombName" ]]; then kill -s SIGSTOP $p; fi; done for p in [0-9]*; do read CMDLINE < $p/cmdline; if [[ $CMDLINE == "processWithBombName" ]]; then kill -s SIGKILL $p; fi; done 

首先,它上面的代码没有并发问题? 例如,当我们停止时,循环读取id = {1,2,3}的进程,当它停止pid = 1时,id为2的进程已经死了,并且已经创build了pid = 4。 pid = 4会被杀死吗?

其次,我怎样才能杀死用户的所有进程,并确保没有新的进程被创build?