ral*_*ldi 22 unix cleanup fork
$ ls
bash: no more processes
Run Code Online (Sandbox Code Playgroud)
哦哦。看起来有人做了一个叉子炸弹。在我以前工作的地方,这几乎意味着共享服务器需要重新启动,因为即使是具有 root 权限的系统管理员也经常无法解决问题。通常,他们甚至无法得到提示。
我听说过一些技巧(特别是发送 STOP 信号而不是 KILL 信号,因为后者会让剩余的线程立即替换被杀死的线程),但我从未见过题为So, You Have Yourself的综合指南叉形炸弹?
让我们做一个。
小智 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?这将防止您的用户发射叉子炸弹(无论是否意外)。