消除叉炸弹:杀死分叉过程

时间:2015-01-30 15:36:23

标签: linux bash docker

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

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

我用id = 1000的用户运行docker,容器内的用户将拥有id = 3000,因此启动命令的用户不会被fork炸弹阻挡。

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

所以,我正在寻找一种方法来杀死某些特定用户拥有的所有进程,即使进程是fork。我发现blog post有以下代码:

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的进程已经死亡,并且已经创建了pid = 4。 pid = 4会被杀死吗?

其次,如何杀死用户的所有进程并确保没有创建新进程?

0 个答案:

没有答案