为什么命令“:(){:|:&} ;:”使我的系统滞后,以至于我不得不重启?


286

危险!

除非您已准备好崩溃和/或强制重新引导系统,否则请不要运行此命令以对其进行“测试”。

我当时在运行12.04的Virtualbox中尝试编译应用程序,而在等待期间,我偶然遇到了一个论坛,其中有一条评论说:

也尝试:(){ :|: & };:
Fun,并且不需要root。

没想到,我在我的gnome终端中运行了它。它使我的12.04(在Virtualbox中)的延迟非常严重,我不得不将其关闭。

我的问题是该命令的作用是什么?

:(){:|:&} ;:






9
“如此严重的滞后”是相当乐观的。
pstadler

Answers:


372

这就是所谓的叉子炸弹

:() 表示您正在定义一个名为 :

{:|: &}表示运行该函数:并将其输出:再次发送到该函数并在后台运行。

;是命令分隔符。

: 第一次运行该功能。

本质上,您正在创建一个函数,该函数在每次调用时都会调用两次,并且没有任何方法可以终止自身。在您用尽系统资源之前,它将不断加倍。

在Virtualbox中运行非常明智,否则您将不得不重新启动PC。


27
该答案似乎表明重新启动是唯一的方法。但实际上,无需重新启动就可以杀死该前叉炸弹,而且我实际上观察到它无论如何在某些系统上无法正常工作(因为它们的生成限制是合理设置的)。
康拉德·鲁道夫

27
实际上,对于完整的解释,应该提到;命令分隔符。该{ ... }部分只是功能的内容。
CVn 2012年

@MichaelKjörling+1在考虑到您的评论之前,我什至不了解语法。
jumpnett 2012年

1
@SuperMatt我不知道,如果这个问题仍然活跃,但无论如何,我想知道什么呢|&做的。我了解您已经提供了该函数的功能,但我想知道这两个函数的作用
Noober 2015年

1
@Noober如果您仍然想知道(因为我在这个简短而神秘的Linux黑洞中),我知道!| 是一个放置在命令之后的管道,用于将命令输出作为输入发送到随后的命令。&是一个分支,它为前面的命令创建一个新线程,使当前线程继续执行更多命令
flurbius

179

这是在shell中实现的所谓的前叉炸弹

来自维基百科:

:(){ :|:& };:
\_/| |||| ||\- ... the function ':', initiating a chain-reaction: each ':' will start    two more.
 | | |||| |\- Definition ends now, to be able to run ...
 | | |||| \- End of function-block
 | | |||\- disown the functions (make them a background process), so that the children    of a parent
 | | |||   will not be killed when the parent gets auto-killed
 | | ||\- ... another copy of the ':'-function, which has to be loaded into memory.
 | | ||   So, ':|:' simply loads two copies of the function, whenever ':' is called
 | | |\- ... and pipe its output to ...
 | | \- Load a copy of the function ':' into memory ...
 | \- Begin of function-definition
 \- Define the function ':' without any parameters '()' as follows:

3
尽管这是一个切点,并且可能会重载“ disown”一词,但从技术上讲,不会抛弃置于后台的进程,并且始终可以使用“ fg”命令将其置于前台,并且如果出现以下情况,该进程将终止用户注销(如果有仍然可以完成注销资源).... 除非和直到一个运行在进程或作业ID“断绝关系”。在那之后,它确实被取消了:注销将不会终止,并且fg无效。
Rondo

1
尽管这只是一个小问题,但括号并不意味着在bash状的shell中没有任何参数,它们只是C风格语言留下的修饰。
查理·哈丁

75

该命令是前叉炸弹的知名版本

维基百科的叉子炸弹图片

通过无限分叉一个进程,它会使您的计算机用尽内存。您还可以使用一些保护措施来防止它:

Unix类型的系统通常具有进程限制,由ulimit shell命令或其后继程序setrlimit控制。Linux内核设置并强制执行进程的RLIMIT_NPROC rlimit(“资源限制”)。如果某个进程尝试执行派生,而拥有该进程的用户已经拥有该RLIMIT_NPROC进程,则该派生将失败。另外,在Linux或* BSD上,可以编辑pam_limits配置文件/etc/security/limits.conf以达到相同的效果。但是,并非所有Linux发行版都pam_limits默认安装了该模块。


18

根据这个 :(){ :|: & };:被称为

Forkbomb是一种诗意的病毒创造者

...曲折的小程序命令它制作多个副本,从而引发连锁反应,从而迅速耗尽系统资源...

因此建议不要运行此程序,否则可能导致硬件损坏,因为它会导致循环执行,并可能容易导致笔记本电脑发热。

另一个链接通过此处的屏幕快照进行说明。


59
如果叉式炸弹造成硬件损坏,那么您将面临更大,更深的问题。
CVn 2012年

38
也许他说的是叉子附近会爆炸的叉状炸弹?
dysoco

2
屏幕截图的链接已损坏。
IMustBeSomeone

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.