警告:请勿在不了解其含义的情况下尝试此问题中列出的命令。
抱歉,如果这是重复的。我很惊讶地发现一个简单的命令
echo $(yes)
冻结了我的计算机(实际上它严重滞后于计算机而不是冻结,但滞后严重到让人认为它已冻结)。键入CtrlC或CtrlZ在键入此命令后立即键入似乎并不能帮助我从这个输入错误的命令中恢复。
另一方面
ls /*/../*/../*/../*/../*/
是一个众所周知的漏洞,它也会严重滞后于计算机的最佳状态,并使计算机崩溃到最坏的状态。
请注意,这些命令与众所周知的 fork 炸弹完全不同。
我的问题是:有没有办法在我开始在 shell 中执行这些命令后立即中断这些命令,这些命令会构建大量的 shell 命令行选项?
我的理解是,由于shell扩展是在命令执行之前完成的,因此中断命令的通常方法不起作用,因为发生滞后时命令甚至没有运行,但我也想确认我的理解是正确的,并且我非常有兴趣了解在它使用太多内存之前取消 shell 扩展的任何方法。
我不是在寻找内核如何在低内存下工作。当系统已经严重滞后时,我也不会寻找SysRq
可能有用的过度杀伤力。我也不是在寻找诸如强加ulimit
记忆之类的预防性方法。我正在寻找一种方法,可以在它滞后于系统之前从 shell 本身有效地取消一个巨大的 shell 扩展过程。我不知道这是否可能。如果按照评论不可能,也请留下一个答案,最好附上解释。
我选择不在原始问题中包含任何特定于系统的信息,因为我想要一个一般性的答案,但如果这很重要,这里是关于我的系统的信息:Ubuntu 16.04.4 LTS
使用gnome-terminal
and bash 4.3.48(1)
,运行x86_64
系统。不涉及虚拟机。
截至目前,
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
我没有使用虚拟机:存在外壳并且不会冻结系统,并且:
返回
但作为一项规则,当您处理可以获取系统所有资源的事情时,最好在运行之前设置限制,如果您知道一个进程可能是一个 CPU 猪,您可以启动它
cpulimit
或运行renice
.如果你想限制已经启动的进程,你必须通过 PID 一个一个地做,但你可以有一个批处理脚本来做,如下所示:
就我而言
pypdfocr
,启动贪婪tesseract
。在某些情况下,如果您的 CPU 非常好,您可以使用
renice
这样的: