![我怎样才能摆脱叉子炸弹?](https://linux22.com/image/983606/%E6%88%91%E6%80%8E%E6%A0%B7%E6%89%8D%E8%83%BD%E6%91%86%E8%84%B1%E5%8F%89%E5%AD%90%E7%82%B8%E5%BC%B9%EF%BC%9F.png)
我尝试了 fork 炸弹代码:
:(){:|:&};:
并关闭了 PuTTy。现在它不接受新的连接(拒绝服务攻击)。
我怎样才能恢复呢?
答案1
您可能需要硬重启计算机。
假设您有控制台访问权限,您可以尝试获取进程组 ID (PGID) 并使用以下命令终止它:
kill -- -PGID
或者使用SIGKILL
代替SIGTERM
:
kill -9 -- -PGID
但实际上可能无法获取 PGID,因为系统可能已经被分叉进程占用,从而造成死锁。
当对用户或组可以拥有的进程数量没有足够的限制时,可能会发生这种死锁。因此,在尝试诸如 fork-bomb 之类的破坏性操作之前,最好先设置一个下限。
答案2
您已经使用经典的“fork bomb”耗尽了系统的所有进程,现在您无法让系统运行进程来帮助您(并且所有命令、程序等都需要进程“运行”)。任何干预都必须来自系统外部(例如,重置虚拟机、关闭电源、CtrlAltDelete)。您不明白代码的意思吗?
:(){:|:&};:
:()
定义一个shell函数,名为“:”。
{
开始函数的定义,即:
:
调用“:”函数。
|
通过管道输出“:”
:
再次调用“:”
&
派生一个进程将管道(:|:
)放在后台。
}
函数定义结束“:”
;
定义“:”函数的 shell 语句结束
:
调用“:”函数开始。
如果您在不理解代码的情况下运行代码,那么您就接受代码的结果。
答案3
根据这理论上应该可以使用Alt+SysRq+f来消除 fork 炸弹 — — 不过,这可能只有当内核能够分配足够的内存来杀死它时才有可能。
答案4
如果你不能重新连接,您没有机会。也许您可以等待out of memory error
如果你能连接,尝试以下命令
pkill -f :
正如你在评论中所说的那样
我在虚拟盒中运行它
通过 VirtualBox 重置机器。