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

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

危险!

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

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

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

我没有多想,就在我的 gnome 终端中运行了它。它让我的 12.04(在 Virtualbox 中)严重滞后,我不得不关闭它。

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

:(){ :|: & };:

答案1

这被称为叉子炸弹

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

{:|: &}:函数的主体。它递归调用该函数:并将其输出发送(管道)给另一个调用:。并且&意味着创建的进程必须在后台运行。

;命令分隔符。

最后:第一次运行该函数。

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

在 Virtualbox 中运行确实非常明智,否则您就必须重新启动电脑。

答案2

这就是所谓的叉子炸弹在 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

该命令是叉子炸弹

叉子炸弹图片来自维基百科

它会无限分叉进程,导致计算机内存耗尽。您也可以使用一些保护措施来防止这种情况:

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

答案4

它被称为“叉子炸弹”如上所述,另一种方法是使用后台执行而不是管道:

:(){ :&:;};:

相关内容