编写一个bash shell脚本,为用户定义的时间消耗一定量的RAM

我正在尝试编写一个bash shell脚本,在embedded式设备上为用户定义的时间消耗大量的RAM。 我怎么做,而不使用数组?

即使不支持传统的Bash数组 ,也可以使用构建在特定shell中的eval命令创建类似数组的变量。

以下示例脚本基于我在嵌入式Linux项目中使用BusyBox时所做的一些脚本。 BusyBox使用Almquist shell (也称为Shell,ash和sh),它不支持数组。

 #!/bin/ash for index in 1 2 3 4 5; do value=$(($index * 1024)) eval array$index=\"array[$index]: $value\" done for i in 1 3 5; do eval echo \$array$i done 

使用eval时要小心引用!

输出:

 array[1]: 1024 array[3]: 3072 array[5]: 5120 

根据您的特定场景,类似于以下的脚本可能就足够了。

 #!/bin/ash echo "Provide sleep time in the form of NUMBER[SUFFIX]" echo " SUFFIX may be 's' for seconds (default), 'm' for minutes," echo " 'h' for hours, or 'd' for days." read -p "> " delay echo "begin allocating memory..." for index in $(seq 1000); do value=$(seq -w -s '' $index $(($index + 100000))) eval array$index=$value done echo "...end allocating memory" echo "sleeping for $delay" sleep $delay 

在我的简短测试中,这个脚本在5分钟的指定时间内消耗了大约570M到〜575M的物理内存。

*在单独的测试中使用top和memprof程序进行监控

就我个人而言,我会选择尼克的答案,因为在C中做这件事真的会容易得多。

但是,如果你真的想避免编写一个超级简单的C程序来完成这个任务,那么(如果系统正在运行的Linux内置了正确的东西),你应该可以通过安装一个大小为tmpfs限制你想要使用的内存,然后将数据分发到tmpfs中的文件中(例如,通过从无限源(例如/dev/zero )复制数据)。

C程序真的很容易,只要你可以编译平台。

您需要区分分配的RAM和工作RAM。 在bash中吃掉内存很容易:

 A="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" for power in $(seq 8); do A="${A}${A}" done 

但除非脚本经常通过数据搅动,否则这些内存页面是很好的候选者。

@JohnBartholomew

你对tmpfs挂载的想法也并不难,你可以更确定它实际上是在消耗RAM,对吗? (请参阅Chris Dodd在Nick的回答中的评论)

mount -t tmpfs none /new/path/for/temp -o size=32m
dd if=/dev/zero of=/new/path/for/temp/zero.txt bs=32m count=1

可能dd会抱怨设备上没有剩余空间。 此外,我不知道多少内存将被准确使用,但如果你在谈论MB的比这应该是好的。

如果你有一个/dev/shm设备,你可以写入到那里的文件,因为它默认是一个tmpfs。

我想出了这个。 / dev是一个tmpfs

  #!/bin/sh mntroot rw cd /dev while : do dd > /dev/null 2>&1 if=/dev/zero of=myfile1 count=25000 bs=1024 # eat up 25 MB of RAM usleep 1 rm myfile1 done