中断shell命令行扩展

Wei*_*hou 5 command-line bash kill interrupt

警告:不要在不知道其含义的情况下尝试此问题中列出的命令。

对不起,如果这是重复的。我很惊讶地发现一个简单的命令

echo $(yes)
Run Code Online (Sandbox Code Playgroud)

冻结了我的计算机(实际上它严重滞后于计算机而不是冻结,但滞后严重到让人认为它已冻结)。键入CtrlCCtrlZ在键入此命令后立即键入似乎并不能帮助我从这个错误键入的命令中恢复过来。

另一方面

ls /*/../*/../*/../*/../*/
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

我不是在寻找内核如何在低内存下工作。我也不是在寻找SysRq在系统已经严重滞后时可能会有帮助的过度杀伤力。我也不是在寻找预防方法,例如ulimit在记忆中强加一个。我正在寻找一种方法,可以在它滞后于系统之前有效地从外壳本身内部取消巨大的外壳扩展过程。我不知道是否有可能。如果评论不可能,请同时留下一个答案,指出这一点,最好附上解释。

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

Edu*_*scu 1

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

echo $(yes) 
Run Code Online (Sandbox Code Playgroud)

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

ls /*/../*/../*/../*/../*/
Run Code Online (Sandbox Code Playgroud)

回报

bash: /bin/ls: Argument list too long
Run Code Online (Sandbox Code Playgroud)

但作为一项规则,当您处理可能获取系统所有资源的事物时,最好在运行之前设置限制,如果您知道某个进程可能会占用 cpu,您可以启动它或cpulimit运行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
Run Code Online (Sandbox Code Playgroud)

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

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

watch -n5 'pidof tesseract | xargs -L1 sudo renice +19'
Run Code Online (Sandbox Code Playgroud)