Write a bash shell script that consumes a constant amount of RAM for a user defined time [closed]
Even if traditional Bash arrays are not supported, it may still be possible to create array-like variables using the eval
command built into the particular shell.
The following example script is based on some scripting I did when using BusyBox in an embedded Linux project. BusyBox uses the Almquist shell (also known as A Shell, ash, and sh), which does not support arrays.
#!/bin/ashfor index in 1 2 3 4 5; do value=$(($index * 1024)) eval array$index=\"array[$index]: $value\"donefor i in 1 3 5; do eval echo \$array$idone
Be careful with quoting when using eval
!
Output:
array[1]: 1024array[3]: 3072array[5]: 5120
Depending on your particular scenario, a script similar to the following may suffice.
#!/bin/ashecho "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 "> " delayecho "begin allocating memory..."for index in $(seq 1000); do value=$(seq -w -s '' $index $(($index + 100000))) eval array$index=$valuedoneecho "...end allocating memory"echo "sleeping for $delay"sleep $delay
In my brief testing, this script consumed ~570M to ~575M physical memory* for the specified time period of 5 minutes.
* Monitored using top and memprof programs in separate tests
Personally I would go with Nick's answer, since doing it in C is going to be much easier really.
But... if you really want to avoid writing a super-simple C program to do it, then (if the system is running Linux with the right stuff built in) you should be able to do it by mounting a tmpfs with a size limit of however much memory you want to use, then spewing data into a file in that tmpfs to fill it up (by, e.g., copying data from an infinite source (e.g., /dev/zero
).
The C program is really easier though, as long as you can compile for the platform.
If you have a /dev/shm
device, you can write to file located there, since it's a tmpfs by default.