叉形炸弹后最好的清理方法是什么?

ral*_*ldi 22 unix cleanup fork

$ ls
bash: no more processes
Run Code Online (Sandbox Code Playgroud)

哦哦。看起来有人做了一个叉子炸弹。在我以前工作的地方,这几乎意味着共享服务器需要重新启动,因为即使是具有 root 权限的系统管理员也经常无法解决问题。通常,他们甚至无法得到提示。

我听说过一些技巧(特别是发送 STOP 信号而不是 KILL 信号,因为后者会让剩余的线程立即替换被杀死的线程),但我从未见过题为So, You Have Yourself的综合指南叉形炸弹?

让我们做一个。

Chr*_*ith 11

使用ulimit以合理的每个用户进程限制防止 fork 炸弹耗尽进程限制。

这样,单个用户将在达到系统限制之前很久就用完他们的进程配额。


小智 7

首先要尝试的是让登录的用户注销。他们的 shell 可能是执行所有分叉的进程的父进程,这可能会结束问题。

如果这不起作用,您可以尝试kill -STOP -2以 root 身份运行以冻结以 root 以外的任何用户身份运行的所有进程。如果可行,那么您可以使用kill -CONT <pid>解冻一些与 fork 炸弹无关的已知进程并杀死它们以消除完整的进程表问题,并为您提供一些喘息的空间来追踪和杀死问题的原始根源。Sendmail 将是一个很好的系统进程被杀死的例子,因为通过使用 .pid 文件来识别 pid 很容易识别。例如,kill -CONT $(< /var/run/sendmail.pid); kill $(< /var/run/sendmail.pid)


小智 3

不知道如何发送停止信号,因为生成kill需要可用的进程句柄。此外,根据我的经验,系统在进程耗尽之前就会过载且无法使用。

您是否考虑过简单地强制执行每个用户进程限制ulimit?这将防止您的用户发射叉子炸弹(无论是否意外)。

  • Kill 是一个内置的 shell,至少在 bash 中是这样。 (3认同)
  • 如果它不是内置的,您可以运行“exec Kill PID”,这不会分叉。但这是有风险的,因为如果它不起作用,你可能无法获得另一个外壳。将其视为系统管理的蜜蜂叮咬方法! (2认同)