Skip to content

Instantly share code, notes, and snippets.

@ThomasLau
Last active August 29, 2015 14:18
Show Gist options
  • Save ThomasLau/d323f2a3f6aeb36242dc to your computer and use it in GitHub Desktop.
Save ThomasLau/d323f2a3f6aeb36242dc to your computer and use it in GitHub Desktop.

今天在知乎看到这样一条bash命令(在类UNIX系统的shell环境下运行): 1:(){ :|:& };: 在终端执行完之后,我的Linux果然在一瞬间死掉了,风扇狂转… 查资料得: 这东西叫”Fork bomb”,2002年由Jaromil设计,通过不断fork出新的进程,一生二,二生四,四生八…然后指数爆炸,迅速耗光电脑资源。 我们来分析一下,把这条命令分解:

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

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment