web-dev-qa-db-ja.com

ユーザー定義の時間に一定量のRAM=を消費するbashシェルスクリプトを記述します

組み込みデバイスでユーザー定義の時間にRAM)を大量に消費するbashシェルスクリプトを記述しようとしています。配列を使用せずにそれを行うにはどうすればよいですか?

24
Ankur Agarwal

従来の 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プログラムを別々のテストで使用して監視

18
jschmier

個人的には、Cで行う方がはるかに簡単になるので、ニックの答えを使用します。

しかし...本当にシンプルなCプログラムを作成することを避けたい場合は(システムが適切なものを組み込んでLinuxを実行している場合)、tmpfsをサイズでマウントすることでそれを実行できるはずです。使用したいメモリの量を制限し、データをそのtmpfsのファイルに吐き出していっぱいにします(たとえば、無限のソースからデータをコピーする(たとえば、/dev/zero)。

ただし、プラットフォーム用にコンパイルできる限り、Cプログラムは本当に簡単です。

4

/dev/shmデバイス。デフォルトではtmpfsなので、そこにあるファイルに書き込むことができます。

3
ℝaphink

割り当てられたRAMとワーキングセットRAMを区別する必要があります。 bashでメモリを使い果たすのは簡単です。

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

しかし、スクリプトがデータを頻繁に移動しない限り、それらのメモリのページは交換するのに適した候補です。

3
Phil

これを思いついた。/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
2
Ankur Agarwal

ゆうたろう

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の場合はこれで十分です。

2
jbvo