危险!
除非您准备好应对崩溃和/或强制重启系统,否则请不要运行此命令来“测试”它。
我在运行 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
它被称为“叉子炸弹”如上所述,另一种方法是使用后台执行而不是管道:
:(){ :&:;};: