AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 469950
Accepted
Plancton
Plancton
Asked: 2018-09-19 23:32:27 +0800 CST2018-09-19 23:32:27 +0800 CST 2018-09-19 23:32:27 +0800 CST

为什么我不能用分叉炸弹使我的系统崩溃?

  • 772

最近我一直在挖掘有关 GNU/Linux 中进程的信息,并且遇到了臭名昭著的 fork 炸弹:

:(){ : | :& }; :

理论上,它应该无限复制自己,直到系统耗尽资源......

但是,我已经尝试在CLI Debian和GUI Mint发行版上进行测试,它似乎对系统没有太大影响。是的,有很多进程被创建,过了一会儿我读到了控制台消息,比如:

bash:fork:资源暂时不可用

bash:fork:重试:没有子进程

但一段时间后,所有进程都会被杀死,一切都恢复正常。我已经读过ulimit为每个用户设置了最大进程数,但我似乎无法将它提高到很远。

针对叉形炸弹的系统保护措施是什么?为什么它不会自我复制,直到一切都冻结或至少滞后很多?有没有办法用叉子炸弹真正使系统崩溃?

linux process
  • 3 3 个回答
  • 16112 Views

3 个回答

  • Voted
  1. Best Answer
    Hkoof
    2018-09-20T00:46:55+08:002018-09-20T00:46:55+08:00

    您可能有一个使用 systemd 的 Linux 发行版。

    Systemd 为每个用户创建一个 cgroup,一个用户的所有进程都属于同一个 cgroup。

    Cgroups 是一种 Linux 机制,用于设置系统资源的限制,例如最大进程数、CPU 周期、RAM 使用量等。这是一个不同的、更现代的资源限制层ulimit(它使用getrlimit()系统调用)。

    如果您运行systemctl status user-<uid>.slice(代表用户的 cgroup),您可以看到该 cgroup 中允许的当前和最大任务数(进程和线程)。

    $ systemctl status user-$UID.slice
    ● user-22001.slice - UID 22001 的用户切片
       加载:加载
      插入:/usr/lib/systemd/system/user-.slice.d
               └─10-defaults.conf
       活跃:自 2018 年 9 月 10 日星期一 17:36:35 EEST 起活跃;1 周 3 天前
        任务:17(限制:10267)
       内存:616.7M
    

    默认情况下,systemd 允许每个用户的最大任务数是“系统范围最大值”(sysctl kernel.threads-max)的 33%;这通常相当于约 10,000 个任务。如果要更改此限制:

    • 在 systemd v239 及更高版本中,用户默认设置通过TasksMax=在:

      /usr/lib/systemd/system/user-.slice.d/10-defaults.conf
      

      要调整特定用户的限制(将立即应用并存储在 /etc/systemd/system.control 中),请运行:

      systemctl [--runtime] set-property user-<uid>.slice TasksMax=<value>
      

      覆盖单元设置的常用机制(例如systemctl edit)也可以在此处使用,但它们需要重新启动。例如,如果您想更改每个用户的限制,您可以创建/etc/systemd/system/user-.slice.d/15-limits.conf.

    • 在 systemd v238 及更早版本中,用户默认值是通过UserTasksMax= in设置的/etc/systemd/logind.conf。更改值通常需要重新启动。

    有关此的更多信息:

    • man 5 systemd.resource-控制
    • man 5 systemd.slice
    • 人 5 logind.conf
    • http://0pointer.de/blog/projects/systemd.html(在此页面搜索 cgroups)
    • man 7 cgroups和https://www.kernel.org/doc/Documentation/cgroup-v1/pids.txt
    • https://en.wikipedia.org/wiki/Cgroups
    • 86
  2. Joshua
    2018-09-20T08:25:10+08:002018-09-20T08:25:10+08:00

    无论如何,这不会使现代 Linux 系统崩溃。

    它会创建大量进程,但不会在进程空闲时真正消耗那么多 CPU。现在,您在用完 RAM 之前用完了进程表中的插槽。

    如果您没有像 Hkoof 指出的那样受到 cgroup 限制,那么以下更改仍然会导致系统崩溃:

    :(){ : | :& : | :& }; :
    
    • 14
  3. T.E.D.
    2018-09-20T10:30:02+08:002018-09-20T10:30:02+08:00

    回到 90 年代,我不小心在自己身上释放了其中一个。我无意中在包含 fork() 命令的 C 源文件上设置了执行位。当我双击它时,csh 尝试运行它,而不是像我想要的那样在编辑器中打开它。

    即使那样,它也没有使系统崩溃。Unix 足够强大,您的帐户和/或操作系统会有进程限制。相反,它变得非常缓慢,任何需要启动进程的东西都可能失败。

    幕后发生的事情是进程表填满了试图创建新进程的进程。如果其中一个终止(由于进程表已满而导致 fork 出现错误,或者由于绝望的操作员试图恢复其系统的健全性),其他进程之一将愉快地分叉一个新进程来填充虚空。

    “叉子炸弹”基本上是一个无意中自我修复的进程系统,其任务是让您的进程表保持完整。阻止它的唯一方法就是以某种方式一次杀死他们。

    • 9

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve