分类: 电脑技术
作者: admin

一条命令搞死电脑的Fork炸弹

今天在知乎看到这样一条bash命令(在类UNIX系统的shell环境下运行):

:(){ :|:& };:

在终端执行完之后,我的Linux果然在一瞬间死掉了,风扇狂转…

查资料得:

这东西叫”Fork bomb”,2002年由Jaromil设计,通过不断fork出新的进程,一生二,二生四,四生八…然后指数爆炸,迅速耗光电脑资源。

我们来分析一下,把这条命令分解:

 
:()      # 定义函数,函数名为":",即每当输入":"时就会自动调用{}内代码
{        # ":"函數起始字元
    :    # 用递归方式调用":"函数本身
    |    # 並用管線(pipe)將其輸出引至...(因为有一个管線操作字元,因此會生成一個新的進程)
    :    # 另一次递归调用的":"函数
         # 综上,":|:"表示的即是每次調用函数":"的時候就會產生兩份拷貝
    &    # 調用間脱鉤,以使最初的":"函数被關閉後為其所調用的兩個":"函數還能繼續執行
}        # ":"函數終止字元
;        # ":"函数定义结束后将要进行的操作...
:        # 调用":"函数,"引爆"fork炸弹

简单地说:1-4行定义了一个函数,函数名就是一个冒号,没有参数,这个函数做这样的一个事情:调用自身,然后用管道开一个新进程,这个进程也是调用自身,并放到后台执行。第5行用来分隔上下两条子命令,上面定义冒号函数,下面调用冒号函数。

在系统中成功“引爆”fork炸弹后,我们可重启来使系统恢复正常运行;而若要以手动的方法使fork炸弹“熄火”,那前提就是必须杀死fork炸弹产生的所有进程。为此我们可以考虑使用程序来杀死fork炸弹产生的进程,但由于这一般需要创建新进程,且由于fork炸弹一直在探测与占用进程槽与内存空间,因而这一方法几乎不可能实现,而且用kill命令杀死进程后,释放出的进程槽又会被余下的fork炸弹线程所产生的新进程占用。

参考资料:http://zh.wikipedia.org/wiki/Fork%E7%82%B8%E5%BC%B9