根据维基百科,:(){ :|:& };:
可以使用zsh命令停止forkbomb while (sleep 100 &!) do; done
,这可能会产生sleep 100进程,直到所有的forkbomb进程都消失.这看起来像魔术; 它是如何工作的?我特别好奇的是"&!" 手段.
bash中等效命令会是什么样的?
叉炸弹工作的原因是因为对任何时候都可以运行的进程数量有一个限制,并且设计了一个分叉炸弹来填补这个限制.
因为你提供的forkbomb代码在它不能产生子进程时会死掉,所以父进程实际上不会挂起,但是这些子进程不断创建新的grand -children这一事实使进程表保持完整.
因此,睡眠解决方案旨在潜入一些只能在短时间内睡眠的过程,并且对于每个能够创建的睡眠过程,都会发生更少的分叉炸弹.最终,睡眠过程自己填满了过程表,叉子炸弹就消失了.
一旦进程表完全关闭睡眠进程,就可以杀死while循环,并且一旦睡眠时间结束,睡眠过程就会消失.问题解决了.
正如已经提到的,zsh命令的重要部分是run-in-background &
,因此bash命令基本上与其他答案中给出的相同:
while (sleep 100 &) do; done
除非你想在睡眠时间内退出,否则我不认为nohup
/ !
部分是重要的,但如果我错了,我会很乐意直截了当.
首先可以编写叉炸弹:
foo() { foo|foo& } foo
这使得它更清晰 - 每次迭代开始两个子过程,然后死亡.因此,如果分叉失败,它将不会徘徊.
因此,我们所要做的就是使分叉暂时失败.因此,我们创建睡眠100并占用进程空间的进程,就像睡眠进程一样.
zsh &!
就像&
是新的进程(不会在注销时杀掉它) - 在这个例子中它可能并不重要.(手动)可以替换nohup
.
因此bash:
while (nohup sleep 100 &) do; done
应该管用.
我是撰写维基百科文章的那部分的人(以及在我的系统上意外启动叉炸弹后"发现"这种治疗方法的人!).
"&!"的原因 而不是"&"确实是为了防止zsh对新进程进行工作控制,即试图关注何时以及是否完成.当我尝试它时,我不记得为什么工作控制是一个问题,但事实确实如此.您实际上可以尝试查看"治愈"的工作原理以及如果您不阻止工作控制会发生什么.也许工作控制的问题与zsh中甚至不存在于bash中的一些错误有关,也许它在zsh中也不再相关.
因此,尝试使用bash"&",如果作业控制干扰,请尝试禁用它("set + m")并希望这可行.
你是对的,维基百科的文章可能不应该是zsh依赖的.