組み込みデバイスでユーザー定義の時間にRAM)を大量に消費するbashシェルスクリプトを記述しようとしています。配列を使用せずにそれを行うにはどうすればよいですか?
従来の Bash配列 がサポートされていない場合でも、特定のシェルに組み込まれている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
私の簡単なテストでは、このスクリプトは〜570Mから〜575Mの物理メモリを消費しました* 指定された期間5分間。
* topとmemprofプログラムを別々のテストで使用して監視
個人的には、Cで行う方がはるかに簡単になるので、ニックの答えを使用します。
しかし...本当にシンプルなCプログラムを作成することを避けたい場合は(システムが適切なものを組み込んでLinuxを実行している場合)、tmpfsをサイズでマウントすることでそれを実行できるはずです。使用したいメモリの量を制限し、データをそのtmpfsのファイルに吐き出していっぱいにします(たとえば、無限のソースからデータをコピーする(たとえば、/dev/zero
)。
ただし、プラットフォーム用にコンパイルできる限り、Cプログラムは本当に簡単です。
/dev/shm
デバイス。デフォルトではtmpfsなので、そこにあるファイルに書き込むことができます。
割り当てられたRAMとワーキングセットRAMを区別する必要があります。 bashでメモリを使い果たすのは簡単です。
A="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
for power in $(seq 8); do
A="${A}${A}"
done
しかし、スクリプトがデータを頻繁に移動しない限り、それらのメモリのページは交換するのに適した候補です。
これを思いついた。/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
ゆうたろう
Tmpfsマウントについてのあなたの考えもそれほど難しくはなく、実際に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の場合はこれで十分です。