EC2 のインスタンスを再起動した際に、スワップ領域の割り当てに失敗していたので調査してみました。
起動時に自動で割り当て
EC2 起動時のスワップ領域割り当てですが、これまでは以下の記事を参考に、/etc/rc.local を使って行っていました。
しかし、最近になって、EC2 インスタンス起動時にスワップ領域が割り当てられなくなっていたので原因を調べてみました。
これまでは、問題なく動作していたので、AmazonLinux の OS イメージファイルの違いや、カーネルのバージョンによる影響なのかなっと疑っています。
スクリプトの実行確認
実際に、メモリ計算部分を単独で実行してみると、どうやら、メモリ計算式の演算部分でエラーが出ているようです。t2.micro のインスタンスで確認しています。
1 2 3 4 5 6 7 8 | $ vi mem.sh #!/bin/sh MEMSIZE=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'` echo ${MEMSIZE} if [ $MEMSIZE -lt 2097152 ]; then SIZE=${((MEMSIZE * 2))}k fi echo ${SIZE} |
これを実行してみると。
1 2 3 | $ sh mem.sh 1017368 mem.sh: line 8: ${((MEMSIZE * 2))}k: bad substitution |
スクリプトエラーの原因調査
ちなみに、現在のカーネルのバージョンは以下の通り。
1 2 | $ uname -a Linux ip-xxx-xx-xx--xxx 4.9.43-17.38.amzn1.x86_64 #1 SMP Thu Aug 17 00:20:39 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux |
う~ん、変数展開の部分で怒られているようですが、パっと解決策が思いつかなかったので、純粋に演算させることにしました。
1 2 3 4 5 6 7 8 9 | if [ $MEMSIZE -lt 2097152 ]; then SIZE=`expr ${MEMSIZE} \* 2`k elif [ $MEMSIZE -lt 8388608 ]; then SIZE=${MEMSIZE}k elif [ $MEMSIZE -lt 67108864 ]; then SIZE=`expr ${MEMSIZE} / 2`k else SIZE=4194304k fi |
まだまだ、シェルの勉強不足です・・・。