记录我的一些生活写照、无聊的牢骚、内心世界的活动 注册 | 登陆

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

一条命令搞死电脑的Fork炸弹
今天在知乎看到这样一条bash命令(在类UNIX系统的shell环境下运行):
XML/HTML代码
  1. :(){ :|:& };:
在终端执行完之后,我的Linux果然在一瞬间死掉了,风扇狂转…
查资料得:
这东西叫”Fork bomb”,2002年由Jaromil设计,通过不断fork出新的进程,一生二,二生四,四生八…然后指数爆炸,迅速耗光电脑资源。
我们来分析一下,把这条命令分解:
XML/HTML代码
  1. :()      # 定义函数,函数名为":",即每当输入":"时就会自动调用{}内代码  
  2. {        # ":"函數起始字元  
  3.     :    # 用递归方式调用":"函数本身  
  4.     |    # 並用管線(pipe)將其輸出引至...(因为有一个管線操作字元,因此會生成一個新的進程)  
  5.     :    # 另一次递归调用的":"函数  
  6. # 综上,":|:"表示的即是每次調用函数":"的時候就會產生兩份拷貝  
  7.     &    # 調用間脱鉤,以使最初的":"函数被關閉後為其所調用的兩個":"函數還能繼續執行  
  8. }        # ":"函數終止字元  
  9. ;        # ":"函数定义结束后将要进行的操作...  
  10. :        # 调用":"函数,"引爆"fork炸弹  
 
简单地说:1-4行定义了一个函数,函数名就是一个冒号,没有参数,这个函数做这样的一个事情:调用自身,然后用管道开一个新进程,这个进程也是调用自身,并放到后台执行。第5行用来分隔上下两条子命令,上面定义冒号函数,下面调用冒号函数。
在系统中成功“引爆”fork炸弹后,我们可重启来使系统恢复正常运行;而若要以手动的方法使fork炸弹“熄火”,那前提就是必须杀死fork炸弹产生的所有进程。为此我们可以考虑使用程序来杀死fork炸弹产生的进程,但由于这一般需要创建新进程,且由于fork炸弹一直在探测与占用进程槽与内存空间,因而这一方法几乎不可能实现,而且用kill命令杀死进程后,释放出的进程槽又会被余下的fork炸弹线程所产生的新进程占用。

« 上一篇 | 下一篇 »

发表评论

评论内容 (必填):