为什么命令 ":(){ :|: & };:" 使我的系统严重滞后,我不得不重新启动?

bla*_*899 304 command-line

危险!

除非您准备好崩溃和/或强制重启系统,否则不要运行此命令来“测试”它。

我在运行 12.04 的 Virtualbox 中尝试编译一个应用程序,在等待的过程中,我偶然发现了一个论坛,其中有一条评论说:

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

我不假思索地在我的 gnome 终端中运行了它。它使我的 12.04(在 Virtualbox 中)严重滞后,我不得不将其关闭。

我的问题是这个命令有什么作用?

:(){ :|: & };:

小智 389

这就是所谓的叉形炸弹

:() 意味着您正在定义一个名为 :

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

;是命令分隔符。

: 第一次运行该函数。

本质上,您正在创建一个函数,该函数每次调用都会调用两次,并且没有任何方法可以终止自身。它会一直加倍,直到你用完系统资源。

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

  • 这个答案似乎表明重新启动是*唯一*的方法。但事实上,这个 fork 炸弹可以在不重启的情况下被杀死,而且我实际上观察到它在某些系统上无论如何都不能正常工作(因为它们的生成限制设置得很合理)。 (30认同)
  • 实际上,对于完整的解释,这可能应该提到`;` 是一个命令分隔符。`{ ... }` 部分只是函数的内容。 (30认同)

Mic*_*jer 187

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

来自维基百科:

:(){ :|:& };:
\_/| |||| ||\- ... 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:
Run Code Online (Sandbox Code Playgroud)

  • 尽管这是一个切入点并且术语“disown”可能会过载,但从技术上讲,置于后台的进程并不会被拒绝,并且始终可以使用“fg”命令将其置于前台,并且如果出现以下情况,进程将终止用户注销(如果仍有资源可用于完成注销)...... *除非*并且直到在进程或jobid上运行“disown”。之后它确实被否认了:注销不会终止并且 fg 无效。 (6认同)
  • 虽然这只是一个小问题,但括号并不意味着类似 bash 的 shell 中没有参数,它们只是 C 风格语言遗留下来的装饰。 (2认同)

Nem*_*emo 77

该命令是众所周知的fork 炸弹版本

来自维基百科的叉式炸弹图片

它通过无限地分叉进程导致您的计算机内存不足。您也可以使用一些保护措施来对付它:

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


ate*_*enz 20

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

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

……狡猾的小程序命令它复制自己的多个副本,引发连锁反应,从而迅速耗尽系统资源……

所以建议不要运行它,可能会损坏硬件,因为它会导致循环执行,可能会导致笔记本电脑很容易发热。

另一个链接通过此处的屏幕截图进行解释。

  • 如果分叉炸弹导致**硬件损坏**,那么您将面临更大更深层次的问题。 (62认同)
  • 也许他在谈论一种可以在您的 PC 附近爆炸的叉形炸弹? (43认同)