中断 shell 命令行扩展

中断 shell 命令行扩展

警告:在不了解其含义的情况下,请勿尝试本问题中列出的命令。

抱歉,如果这是重复的。我很惊讶地发现一个命令如此简单

echo $(yes)

我的电脑死机了(实际上,计算机的延迟非常严重,而不是死机,但这种延迟足以让人认为它已经死机了)。输入CtrlCCtrlZ输入此命令后立即输入似乎无法帮助我从这个错误输入的命令中恢复。

另一方面

ls /*/../*/../*/../*/../*/

是一个众所周知的漏洞,它也会使计算机严重滞后于最佳状态,并使计算机崩溃到最坏的情况。

请注意,这些命令与众所周知的 fork 炸弹有很大不同。

我的问题是:有没有办法在我开始在 shell 中执行这些命令后立即中断这些命令,这些命令会立即生成大量 shell 命令行选项?

我的理解是,由于 shell 扩展是在命令执行之前完成的,因此中断命令的通常方法不起作用,因为当发生滞后时命令甚至没有运行,但我也想确认我的理解是正确的,并且我非常有兴趣了解在 shell 扩展使用过多内存之前取消它的任何方法。

我不是在寻找内核在低内存情况下如何工作。我也不是在寻找SysRq当系统已经严重滞后时可能会有所帮助的过度杀戮。我也不是在寻找诸如强加ulimit记忆之类的预防方法。我正在寻找一种方法,可以在滞后于系统之前从 shell 本身内部有效地取消巨大的 shell 扩展过程。我不知道是否可以。如果按照评论不可能,也请留下一个答案,最好有解释。

我选择不在原始问题中包含任何特定于系统的信息,因为我想要一个一般性答案,但如果这很重要,这里是有关我的系统的信息:Ubuntu 16.04.4 LTS使用gnome-terminalbash 4.3.48(1),运行x86_64系统。不涉及虚拟机。

答案1

截至目前GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu),我没有使用虚拟机:

echo $(yes) 

存在 shell 并且不会冻结系统,并且:

ls /*/../*/../*/../*/../*/

回报

bash: /bin/ls: Argument list too long

但作为一项规则,当您处理可能获取系统所有资源的事物时,最好在运行之前设置限制,如果您知道某个进程可能会占用 cpu,您可以使用cpulimit或 run启动它renice

如果你想限制已经启动的进程,你必须通过PID一一执行,但是你可以使用一个批处理脚本来执行此操作,如下所示:

#!/bin/bash
LIMIT_PIDS=$(pgrep tesseract)   # PIDs in queue replace tesseract with your name
echo $LIMIT_PIDS
for i in $LIMIT_PIDS
do
    cpulimit -p $i -l 10 -z &   # to 10 percent processes
done

就我而言,pypdfocr启动贪婪的tesseract.

另外,在某些情况下,如果您的 CPU 非常好,您可以使用renice如下所示的方法:

watch -n5 'pidof tesseract | xargs -L1 sudo renice +19'

相关内容