如何使用bash脚本生成内存不足

Lil*_*ton 2 bash shell esxi

我需要编写一个bash脚本,它会消耗我的ESXi的最大RAM并可能产生内存不足.

我已经在这里检查并尝试多次运行给定的脚本,以便我可以消耗更多500Mb的RAM.

但是我得到了"sh:out of memory"错误(当然),我想知道是否有可能配置分配给我的shell的内存量?

  • 注1:另一个要求是我无法进入VM运行贪婪的任务.
  • 注意2:我试图编写具有巨大RAM的贪婪新VM的脚本,但是我无法进入内存不足的ESXi状态.
  • 注3:我不能使用C编译器,我只有非常有限的python库.

预先感谢您的帮助 :)

Luc*_*Luc 5

从我之前的答案:https://unix.stackexchange.com/a/254976/30731

如果你有基本的GNU工具(sh,grep,yeshead),你可以这样做:

yes | tr \\n x | head -c $BYTES | grep n
 # Protip: use `head -c $((1024*1024*2))` to calculate 2MB easily
Run Code Online (Sandbox Code Playgroud)

这是因为grep在RAM中加载了整行数据(在grepping磁盘映像时我以相当不幸的方式学习了这一点).线,通过所产生yes,替换新行,将是无限长的,但由不限head$BYTES字节,从而将grep的加载在存储器$字节.Grep本身对我使用100-200KB,你可能需要减去更精确的数量.

如果你还想添加一个时间约束,这可以很容易地完成bash(不适用sh):

cat <(yes | tr \\n x | head -c $BYTES) <(sleep $SECONDS) | grep n
Run Code Online (Sandbox Code Playgroud)

<(command)件事似乎鲜为人知,但通常非常有用,更多信息在这里:http://tldp.org/LDP/abs/html/process-sub.html

然后使用cat:cat将等待输入完成直到退出,并通过保持其中一个管道打开,它将使grep保持活着状态.

如果你有pv并且想要慢慢增加RAM使用率:

yes | tr \\n x | head -c $BYTES | pv -L $BYTESPERSEC | grep n
Run Code Online (Sandbox Code Playgroud)

例如:

yes | tr \\n x | head -c $((1024*1024*1024)) | pv -L $((1024*1024)) | grep n
Run Code Online (Sandbox Code Playgroud)

将以每秒1MB的速度使用高达1 GB.作为额外的奖励,pv将向您显示目前的使用率和迄今为止的总使用量.当然,这也可以通过以前的变体来完成:

yes | tr \\n x | head -c $BYTES | pv | grep n
Run Code Online (Sandbox Code Playgroud)

只需插入| pv |部件即可显示当前状态(吞吐量和总数,默认情况下,我认为 - 否则请查看man(ual)页面).