zabbixモニタスクリプトでpsコマンドを使用してプロセスCPU使用率とメモリ使用率をモニタし、データが0になった場合の説明
前提:zabbixモニタリングスクリプトを自分で作成し、テンプレートを構成することで、リソース(cpuとメモリ)の使用率が高いプロセスをモニタリングしたい.
手順の説明:zabbixバージョンは2.2.21で、監視されているホストオペレーティングシステムはCentOS 6.4です.スクリプトの主なコマンドは以下の通りです:percent=0;
#スクリプトでパラメータprocess=$1を入力します.
#psauxパラメータでCPU%とMEM%の値を取得し、awkを使用して4行目のMEM%の値をpercent=
echo $percent
問題の説明:cliで上記のスクリプトコマンドを実行すると、プロセスリソースの使用率に対応する数値が得られることがわかりました.ただし、スクリプトには同じコマンド条件が含まれています.スクリプトを実行すると、常に0.0の値が得られます.スクリプトが入力した$1、すなわちプロセス名のみが変更されます.スクリプトが実行されると、通常のデータではなく0.0の値が得られます.
影響:zabbixのwebページでは、このデータに関するdataviewが構成されているため、dataviewのデータ表示が不正確になります.
解決策(後述2):1.内蔵zabbix変数proc.cpu.util[,,,,,]とproc.mem.util[,,,,,,,,]を使用します.(zabbix 2.221にはこの内蔵変数はなく、zabbix 3.0以上のバージョンでのみproc.cpu.utilが追加されています)
2.スクリプトのコマンドを変更し、まずプロセス名に対応するpidを取得し、topと組み合わせて次のコマンドを実行します.top-b-n 1-p$pid 2>&1|awk-v pid=$pid'{if($1==pid)print$9}'
3.スクリプトのコマンドを変更し、まずプロセス名に対応するpidを取得し、/proc/$pid/ディレクトリから関連データを読み出し、計算して取得する方法に変更します.
後記1:以上の3つの解決策は検証されていませんが、個人的にはzabbix内蔵変数構成テンプレートを使用したほうが良いと思います.個人の能力には限界があるので、専門的なzabbixを信じましょう.
後記2:私はスクリプトの中でスクリプトを実行するプロセスを排除していないで、元のコードにgrep-v bashを追加して、問題は解決します.(脚本を書くのはまだ厳密ではないようですが・・・)
手順の説明:zabbixバージョンは2.2.21で、監視されているホストオペレーティングシステムはCentOS 6.4です.スクリプトの主なコマンドは以下の通りです:percent=0;
#スクリプトでパラメータprocess=$1を入力します.
#psauxパラメータでCPU%とMEM%の値を取得し、awkを使用して4行目のMEM%の値をpercent=
ps aux | grep $process | grep -v grep | head -1 | awk '{print $4}'
にフィルタします.echo $percent
問題の説明:cliで上記のスクリプトコマンドを実行すると、プロセスリソースの使用率に対応する数値が得られることがわかりました.ただし、スクリプトには同じコマンド条件が含まれています.スクリプトを実行すると、常に0.0の値が得られます.スクリプトが入力した$1、すなわちプロセス名のみが変更されます.スクリプトが実行されると、通常のデータではなく0.0の値が得られます.
影響:zabbixのwebページでは、このデータに関するdataviewが構成されているため、dataviewのデータ表示が不正確になります.
解決策(後述2):1.内蔵zabbix変数proc.cpu.util[,,,,,]とproc.mem.util[,,,,,,,,]を使用します.(zabbix 2.221にはこの内蔵変数はなく、zabbix 3.0以上のバージョンでのみproc.cpu.utilが追加されています)
2.スクリプトのコマンドを変更し、まずプロセス名に対応するpidを取得し、topと組み合わせて次のコマンドを実行します.top-b-n 1-p$pid 2>&1|awk-v pid=$pid'{if($1==pid)print$9}'
3.スクリプトのコマンドを変更し、まずプロセス名に対応するpidを取得し、/proc/$pid/ディレクトリから関連データを読み出し、計算して取得する方法に変更します.
後記1:以上の3つの解決策は検証されていませんが、個人的にはzabbix内蔵変数構成テンプレートを使用したほうが良いと思います.個人の能力には限界があるので、専門的なzabbixを信じましょう.
後記2:私はスクリプトの中でスクリプトを実行するプロセスを排除していないで、元のコードにgrep-v bashを追加して、問題は解決します.(脚本を書くのはまだ厳密ではないようですが・・・)