如何“而(休眠100 &!) do;完成”工作的zsh,以及怎么可能在bash被复制?


14

Wikipedia,该forkbomb :(){ :|:& };:可以用zsh的命令while (sleep 100 &!) do; done停止,这将假想产卵睡眠100点的处理,直到。所有的forkbomb过程都不见了这似乎像魔术;?它是如何工作的我特别好奇,到底是什么!“&”是指

会是什么等效的命令看起来像在bash

11

一个叉炸弹的工作原理的原因是因为有一个有限的限制,可以在任何时间运行的进程数,以及叉式炸弹旨在填补这一限制。

因为你提供的forkbomb代码如果无法产生子进程,就会死掉,父进程并不实际挂起,但是孩子们继续创建新的grand * -children会使进程表保持满状态。

所以睡眠解决方案的设计在一些流程,只是睡的时间很短一段潜行,并为管理创建的每个睡眠过程中,有少叉炸弹发生。最后,睡眠过程会自行填满加工工作台,而叉子炸弹也会消失。

一旦进程表完全关闭睡眠进程,while循环可以被终止,并且一旦睡眠时间到,睡眠进程就会死亡。 问题解决

正如已经提到zsh的命令的重要组成部分,是磨合背景&,所以bash命令将基本上是一样给出其他答案:

while (sleep 100 &) do; done 

我不除非你想在睡眠时间内退出,否则认为nohup/!部分很重要,但如果我错了,我会很乐意被设置成直线。


2

?非常有趣的问题!

根据维基百科的文章,完整的命令的目的是创造许多无害的工作,将禁用叉炸弹,因为它不会再产生更多的孩子。

按照zsh manual

如果作业开始&|' or &!”,然后 该作业立即六亲不认。 启动后,它并没有在工作表中的 的地方,而不是 受这里所描述的作业控制功能 。

我不知道如何实现使用bash一样。然而,类似下面可以做:

nohup sleep 100 & 

8

首先叉炸弹可以写成:

foo() 
{ 
    foo|foo& 
} 
foo 

这使得它更清晰了 - 每次迭代启动两个子过程,然后死亡。所以如果分叉失败了,它不会四处走动。

因此,所有我们要做的是使分叉暂时失败。因此,我们创建睡眠100并占用进程空间的进程,就像睡眠进程一样。

zsh &!就像&,但是不同意新的过程(在注销时不会杀死它) - 在这个例子中它可能不重要。 (manual)可以用nohup替代。

因此在bash:

while (nohup sleep 100 &) do; done 

应该工作。


6

我是那个写维基百科文章那部分的人(以及在我的系统中意外启动fork炸弹后“发现”这种治疗方法的人!)。

“&!”的原因而不是“&”确实是为了防止zsh对新流程进行工作控制,即试图关心何时以及是否完成。我不记得为什么在我尝试时控制工作是一个问题,但事实确实如此。你可以尝试看看“治愈”是如何工作的,以及如果你不阻止工作控制会发生什么。也许与作业控制有关的问题与zsh中的某个bug在bash中甚至不存在有关,也许它在zsh中不再具有相关性。

因此,只需使用bash尝试一个“&”,如果作业控制干扰,请尝试禁用它(“set + m”),并希望这会起作用。

你说得对,维基百科的文章应该不是zsh的依赖。