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

时间:2011-02-11 01:39:55

标签: linux bash shell embedded-linux

我正在尝试编写一个bash shell脚本,该脚本在用户定义的时间内在嵌入式设备上消耗大量RAM。如何在不使用数组的情况下执行此操作?

6 个答案:

答案 0 :(得分:15)

即使不支持传统的Bash arrays,仍然可以使用特定shell中内置的eval命令创建类似数组的变量。

以下示例脚本基于我在嵌入式Linux项目中使用BusyBox时所做的一些脚本。 BusyBox使用Almquist shell(也称为A 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程序进行监视

答案 1 :(得分:4)

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

但是......如果你真的想避免编写一个超级简单的C程序来执行它,那么(如果系统运行Linux并且内置了正确的东西)你应该能够通过安装tmpfs来实现它你想要使用多少内存的大小限制,然后将数据喷入该tmpfs中的文件中以填充它(例如,通过从无限来源复制数据(例如,/dev/zero)。

C程序非常简单,只要你可以为平台编译。

答案 2 :(得分:3)

如果您有/dev/shm设备,则可以写入位于该处的文件,因为默认情况下它是tmpfs。

答案 3 :(得分:3)

您需要区分分配和工作集RAM。在bash中很容易吃掉记忆:

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

但是除非脚本频繁地浏览数据,否则那些内存页面是很好的候选者。

答案 4 :(得分:2)

@JohnBartholomew

你对tmpfs mount的想法也不是那么难,你可以更确定它实际上消耗了RAM,对吧? (见克里斯多德对尼克回答的评论)

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会抱怨设备上没有剩余空间。另外,我不知道将使用多少RAM,但如果你在谈论MB,那应该没问题。

答案 5 :(得分:2)

我想出了这个。 / 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