递归shell脚本应该锁定系统吗?

ump*_*sky 4 scripts system

我打错了字并递归地运行了我的 shell 脚本。例子:

#!/bin/bash
# filename: kill-me-please.sh   
./kill-me-please.sh
Run Code Online (Sandbox Code Playgroud)

这导致我的系统变得无响应,我所能做的就是硬重启。

在 MacOS 上进行了相同的尝试,它能够检测到此问题并以错误方式终止脚本。

我认为操作系统应该能够处理这种情况。这是一个错误吗?

小智 5

你所做的可以称为叉炸弹。fork 炸弹是一个 shell 脚本,或者一个递归调用自身的 shell 命令,从而填满所有系统资源。这不是错误,而是DoS攻击。

每次./kill-me-please.sh执行时,都会创建一个新进程,使用一些内存和时钟周期。您的程序能够创建无数个自己的分叉,但是由于系统资源是有限的,在某个时间点,您将耗尽资源。有很多种分叉炸弹可以利用这种可能性。另一个众所周知的例子是:

$ :(){ :|:& };:
Run Code Online (Sandbox Code Playgroud)

:是shell函数的名称。在该函数中,:在子shell 中递归调用了两次。这将与您的脚本产生相同的影响。

拆除这些分叉炸弹很难,因为在您找到并应用必要的例程之前,所有资源都可能被分叉炸弹利用。这篇维基百科文章解释和讨论了一些恢复方法。

为了防止这种情况,在 Linux 和可能的其他Unices 上,可以使用ulimit实用程序来限制用户可以创建的进程数。ulimit -Hu 50将用户硬限制为 50 个进程(因此用户将无法更改它)。此外,在许多系统上,还有可用于设置此类限制的配置文件。

您的 OS X 系统可能已经设置了进程限制。我可以想到其他方法来防止这种情况发生,但我不能说我的想法既不是有效的解决方案,也不是由任何操作系统实现的,因此,我将自己保留它们。无论如何,阅读此主题的许多人可能会想到相同的可能性。