CPU、メモリー、ディスク使用率 シェルスクリプト編
はじめに
Mrtgグラフを作成する場合、SNMPのTargetにOIDを指定する方法が一般的ですが、加工した情報を採るスクリプトを作成しグラフを作成する機会がありましたので書き残します。シェルスクリプトはmrtg.cfgのTargetに設定します。WindowsのVBスクリプト編はこちらにあります。
CPU使用率の取得
監視対象エージェントホストがWindowsまたはLinuxの場合
* OID .1.3.6.1.2.1.25.3.3.1.2 をsnmpwalkし、
HOST-RESOURCES-MIB::hrProcessorLoad.xの最大値を取得
Memory使用率の取得
監視対象エージェントホストがWindowsの場合
* OID .1.3.6.1.2.1.25.2.3.1 をsnmpwalkし、
HOST-RESOURCES-MIB::hrStorageDescr.5 = STRING: Physical Memory
のPhysical Memoryのxの数値を取得、この数値同じSizeとUsedを探し
HOST-RESOURCES-MIB::hrStorageSize.5 = INTEGER: 260240
HOST-RESOURCES-MIB::hrStorageUsed.5 = INTEGER: 79706
Used/Sizex100で使用率を算出する(上記例 79706/260240x100=30%)
監視対象エージェントホストがLinuxの場合
* OID .1.3.6.1.2.1.25.2.3.1 をsnmpwalkし、
HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: Physical Memory
のPhysical Memoryのyの数値を取得、この数値同じSizeとUsedを探し
HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 3715376
HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 1104480
Used/Sizex100で使用率を算出する(上記例 1104480/3715376x100=29%)
Disk使用率の取得
監視対象エージェントホストがWindowsの場合
* OID .1.3.6.1.2.1.25.2.3.1 をsnmpwalkし、
HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: **C:\\ Label**
のC:\\ Labelのxの数値を取得、この数値同じSizeとUsedを探し
HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 60721838
HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 28520672
Used/Sizex100で使用率を算出する(上記例 28520672/60721838x100=46%)
監視対象エージェントホストがLinuxの場合
* OID .1.3.6.1.2.1.25.2.3.1 をsnmpwalkし、
HOST-RESOURCES-MIB::hrStorageDescr.x = STRING: /
の/(root directory)のyの数値を取得、この数値同じSizeとUsedを探し
HOST-RESOURCES-MIB::hrStorageSize.x = INTEGER: 36682240
HOST-RESOURCES-MIB::hrStorageUsed.x = INTEGER: 2096449
Used/Sizex100で使用率を算出する(上記例 2096449/36682240x100=6%)
使用パッケージ
- mrtg (/usr/bin/mrtg)
- Net-snmp (Snmp-Server, Snmp-Agent)
- Net-snmpコマンド(/use/bin/snmpget,snmpwalk)
スクリプト概要
- CPU、Memory、Diskの使用率をsnmpで取得・加工するシェルスクリプトを作成します
- スクリプトはホスト、OS、コミュニティの引数を受け入れ、2つの値を返します
- 2つのうち、最初に返す値を使用し、2つ目はグラフの上限100%を返します
- 以下のサンプルスクリプトはチェックおよびエラー処理等を省略しています
CPU使用率取得のシェルスクリプト snmpcpuget.sh
#!/bin/bash
host=$1;ostype=$2;comm=$3
cpuarr=`snmpwalk -v1 -c${comm} ${host} .1.3.6.1.2.1.25.3.3.1.2 2>/dev/null | awk 'BEGIN{FS=":"}{print $4}'`
maxcpu=0
for cpu in ${cpuarr[@]}
do
if [ $cpu -gt $maxcpu ];then
maxcpu=$cpu
fi
done
echo $maxcpu;echo 100
Memory使用率取得のBashシェルクリプト snmpramget.sh
#!/bin/bash
host=$1;ostype=$2;comm=$3
if [ "$ostype" == 'windows' ];then
snmp=`snmpget -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.5.5 2> /dev/null`
rams=`echo $snmp | awk 'BEGIN{FS=":"}{print $4}'`
ramu=`snmpget -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.6.5 | awk 'BEGIN{FS=":"}{print $4}'`
echo `expr $ramu \* 100 / $rams`;echo 100
fi
else
snmp=`snmpget -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.5.1 2> /dev/null`
rams=`echo $snmp | awk 'BEGIN{FS=":"}{print $4}'`
ramu=`snmpget -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.6.1 | awk 'BEGIN{FS=":"}{print $4}'`
echo `expr $ramu \* 100 / $rams`;echo 100
fi
Disk使用率取得のシェルスクリプト snmpdiskget.sh
#!/bin/bash
host=$1;ostype=$2;comm=$3
if [ "$ostype" == 'windows' ];then
snmp=`snmpget -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.5.1 2> /dev/null`
disks=`echo $snmp | awk 'BEGIN{FS=":"}{print $4}'`
disku=`snmpget -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.6.1 | awk 'BEGIN{FS=":"}{print $4}'`
echo `expr $disku \* 100 / $disks`;echo 100
else
snmpwalk -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.3 &> /dev/null
lastoid=`snmpwalk -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.3 | grep ': /$' | awk '{print $1}' | awk 'BEGIN{FS="."}{print $2}'`
oid1=".1.3.6.1.2.1.25.2.3.1.5.$lastoid"
oid2=".1.3.6.1.2.1.25.2.3.1.6.$lastoid"
disks=`snmpget -v1 -c${comm} ${host} ${oid1} | awk '{print $4}'`
disku=`snmpget -v1 -c${comm} ${host} ${oid2} | awk '{print $4}'`
echo `expr $disku \* 100 / $disks`;echo 100
fi
mrtg.cfgの設定例
1 EnableIPv6: no
2 WorkDir: /mypath/mrtg
3 #------------------------------------------------------#
4 Target[sample.com.cpu]: `/mypath/bin/snmpcpuget.sh host ostype comm`
5 MaxBytes[sample.com.cpu]: 100
6 Options[sample.com.cpu]: gauge,growright
7 YTicsFactor[sample.com.cpu]: 1
8 Factor[sample.com.cpu]: 1
9 Title[sample.com.cpu]: CPU Load
10 YLegend[sample.com.cpu]: CPU Load
11 #------------------------------------------------------#
12 Target[sample.com.disk]: `/mypath/bin/snmpdiskget.sh host ostype comm`
13 MaxBytes[sample.com.disk]: 100
14 Options[sample.com.disk]: gauge,growright
15 YTicsFactor[sample.com.disk]: 1
16 Factor[sample.com.disk]: 1
17 Title[sample.com.disk]: Disk Usage
18 YLegend[sample.com.disk]: Disk Usage
19 #------------------------------------------------------#
20 Target[sample.com.ram]: `/mypath/bin/snmpramget.sh host ostype comm`
21 MaxBytes[sample.com.ram]: 100
22 Options[sample.com.ram]: gauge,growright
23 YTicsFactor[sample.com.ram]: 1
24 Factor[sample.com.ram]: 1
25 Title[sample.com.ram]: Memory Usage
26 YLegend[sample.com.ram]: Memory Usage
2,4,12,20行目のパス、ホスト、コミュニティは、環境に合わせて変更が必要
Targetの snmp{cpu,ram,disk}get.sh host:ホスト ostype:{windows|unix} comm:コミュニティ
* Path構成
/mypath
|__ /bin
| |__ snmpcpuget.sh
| |__ snmpramget.sh
| |__ snmpdiskget.sh
|__ /mrtg
|__ mrtg.cfgなど
* 実行例
$ pwd
/mypath
$ bin/snmpcpuget.sh host {windows|unix} comm
$ bin/snmpramget.sh host {windows|unix} comm
$ bin/snmpdiskget.sh host {windows|unix} comm
注意:unix,linuxは同じ意味、スクリプトは入力チェック、エラー処理等省略していますので、事前にsnmpコマンドでhost、ostype、commが実際に存在することを確認してから実行して下さい
$ LANG=C /usr/bin/mrtg /mypath/mrtg/mrtg.cfg
$ crontab -e
0,30 * * * * LANG=C /usr/bin/mrtg /mypath/mrtg/mrtg.cfg
ソースとサンプルデータ
ここのgraphsample/linuxにあります。
サンプル画像
おわりに
グラフデータ収集スクリプトはグラフ作成以外に、サーバ監視システムの機能の中のCPU、Memory、Diask使用率の危険値、警告値超えをチェックする機能としても動作させています。興味ある方はここからどうぞ。