/* Get value for current process instance */
switch(attr)
{
case 0: /* vmsize */
GetProcessMemoryInfo(hProcess,&mc,sizeof(PROCESS_MEMORY_COUNTERS));
value=(double)mc.PagefileUsage/1024; /* Convert to Kbytes */
break;
case 1: /* wkset */
GetProcessMemoryInfo(hProcess,&mc,sizeof(PROCESS_MEMORY_COUNTERS));
value=(double)mc.WorkingSetSize/1024; /* Convert to Kbytes */
break;
</code>
下記で設定するのですが…
<code>
/* Recalculate final value according to selected type */
if (count==1) /* First instance */
{
*lastValue = value;
}
switch(type)
{
case 0: /* min */
*lastValue = min((*lastValue),value);
break;
case 1: /* max */
*lastValue = max((*lastValue),value);
break;
case 2: /* avg */
*lastValue = ((*lastValue) * (count-1) + value) / count;
break;
case 3: /* sum */
*lastValue = (*lastValue) + value;
break;
default:
return SYSINFO_RET_FAIL;
}
■修正前
<code>
/* Recalculate final value according to selected type */
if (count==1) /* First instance */
{
*lastValue = value;
}
</code>
■修正後
<code>
/* Recalculate final value according to selected type */
if (count==1) /* First instance */
{
if(type==0){
*lastValue = value;
}else{
*lastValue = 0;
}
}
</code>
KAZ - 投稿数: 1085
yorosikuさん
ウィンドウズ標準ではないexeファイルの何を監視したいのでしょうか?
今後は1質問1種類の書き込みでお願いします。
ちなみに、外部のメールサーバとsmtpのポート25で接続できれば外部のメールサーバでもOKです。
yorosiku - 投稿数: 20
返答ありがとうございます。
exeファイルのプロセスを監視したいと考えています。
録音システムの構築をしているのですが、
録音する為のファイルのいくつかのexeファイルがあり、
正常にプロセスが起動されているかどうかを監視したいと考えています。
KAZ - 投稿数: 1085
yorosikuさん
「proc.num[{exeの名前}]」でプロセス数が取得できますので、プロセスが起動されているかどうかは0か1以上かで判別できます。
が、「正常にプロセスが起動されているかどうか」は判別できないかと。ログに状態を出力させ、そのログを監視する等の仕組みが必要かと。
yorosiku - 投稿数: 20
kazさん
kodaiさん
アドバイスありがとうございます。
確かにプロセスが正常に動いているかどうかを判断する監視方法は
別途考えていかなければならないと思っています。
プロセスが起動しているかの判断ですが、
Windowsのサービスに登録してあるものを、トリガーの設定にて
以下のように設定してみましたが設定できませんでした。
{ホスト名:proc.num[iPod Service].last(0)}=0
[ERROR: トリガーを追加できません]
No such monitored parameter (proc.num[iPod Service]) for host (ホスト名)
num の後に追加する名前を{}でくくったり、実行ファイルのパスを指定してみたりしましたが、上記エラーがでてしまいます。
設定方法で何か誤っている点はありますでしょうか。
kodai - 投稿数: 1341
こんにちは。
このトリガーに指定しているproc.num[iPod Service]のアイテム設定が存在していないためだと思います。
ZABBIXの監視から障害検知はホスト->アイテム->トリガーという流れで設定を行う必要がありますので、マニュアルなどを参照してアイテムの設定後に上記のトリガーを設定するとうまくいくと思います。
あと、試していないのですが、proc.num[]ではなくproc_info[]でないとプロセスの情報は取得できないかもしれません。詳細はマニュアルのアイテムの項を参照してみてください。
yorosiku - 投稿数: 20
kodaiさん
アドバイスありがとうございます。
マニュアル参照し、試して見たいと思います。
KAZ - 投稿数: 1085
TO:kodaiさん
CC:yorosikuさん
WindowsXpの環境ですが、下記でブラウザ「Chrome」のプロセス数が取れました。
<code>
■アイテム
タイプ :ZABBIXエージェント
キー :proc.num[chrome.exe]
データ型:数値(整数)
</code>
同じくWindowsXPですが、Chromeの使用メモリ合計が取れました、
<code>
■アイテム
タイプ :ZABBIXエージェント
キー :proc_info[chrome.exe,wkset,sum]
データ型:数値(整数)
</code>
yorosiku - 投稿数: 20
kazさん、アドバイスありがとうございます。
chromeのプロセス監視が出来ました。
使用メモリの合計値も取れたのですが、
サーバのウェブ画面の最新の値で表示されている数値が79,684。
エージェント側のタスクマネージャで表示されているメモリ数値が
36,668k+5,554k=42,222k(exe2つ分)でした。
これは値が正確に取れていないのでしょうか。
それとも別の要素があるのでしょうか。
KAZ - 投稿数: 1085
yorosikuさん
zabbix1.4.6で確認したところ、sumの動作がおかしいことがわかりました。プロセスが1つだと2倍になってました。3つ以上だと2倍じゃないような気がします。(更新頻度等で正確な計算ができなく…)
ソースを確認してみます。
(ちょっと時間がかかるかもしれません。)
KAZ - 投稿数: 1085
yorosikuさん
トボケていました…
以前読んだソースでした。
その時見を賭していましたが、sumのロジックがおかしいですね。
と言うか、avgもおかしいような…
下記で、wkset等で指定した情報を収集して
<code>
static double GetProcessAttribute(HANDLE hProcess,int attr,int type,int count,double *lastValue)
{
double value;
PROCESS_MEMORY_COUNTERS mc;
IO_COUNTERS ioCounters;
FILETIME ftCreate,ftExit,ftKernel,ftUser;
/* Get value for current process instance */
switch(attr)
{
case 0: /* vmsize */
GetProcessMemoryInfo(hProcess,&mc,sizeof(PROCESS_MEMORY_COUNTERS));
value=(double)mc.PagefileUsage/1024; /* Convert to Kbytes */
break;
case 1: /* wkset */
GetProcessMemoryInfo(hProcess,&mc,sizeof(PROCESS_MEMORY_COUNTERS));
value=(double)mc.WorkingSetSize/1024; /* Convert to Kbytes */
break;
</code>
下記で設定するのですが…
<code>
/* Recalculate final value according to selected type */
if (count==1) /* First instance */
{
*lastValue = value;
}
switch(type)
{
case 0: /* min */
*lastValue = min((*lastValue),value);
break;
case 1: /* max */
*lastValue = max((*lastValue),value);
break;
case 2: /* avg */
*lastValue = ((*lastValue) * (count-1) + value) / count;
break;
case 3: /* sum */
*lastValue = (*lastValue) + value;
break;
default:
return SYSINFO_RET_FAIL;
}
return SYSINFO_RET_OK;
}
</code>
上のif分で初回のみlastValueにvalueを設定するので、sumはプロセスが1個だと2倍に2個以上だとおかしな値になります。
※:プロセスが2つ以上だと2倍にならないのはこの為ですね。
if分でcountが1の時、min以外はvalue=0が正解かと。
これからソース修正して確認します。
KAZ - 投稿数: 1085
yorosikuさん
確認したところ、1.4.1〜1.6.6で動きがおかしいようです。
検証は1.6.4で行いました。
〜zabbix-1.6.4\src\libs\zbxsysinfo\win32\proc.cの255-259行目(GetProcessAttribute関数)を修正したところうまく動きました。
■修正前
<code>
/* Recalculate final value according to selected type */
if (count==1) /* First instance */
{
*lastValue = value;
}
</code>
■修正後
<code>
/* Recalculate final value according to selected type */
if (count==1) /* First instance */
{
if(type==0){
*lastValue = value;
}else{
*lastValue = 0;
}
}
</code>
修正後は下記のWindows版のコンパイル方法の手順でコンパイルして貰えればOKです。
[url=http://www.zabbix.jp/modules/bwiki/index.php?ZABBIX%201.6.2%20%A5%A8%A1%BC%A5%B8%A5%A7%A5%F3%A5%C8%20Windows%C8%C7%20%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB]ZABBIX 1.6.2 エージェント Windows版 インストール[/url]
P.S.
現在、1.6系のzabbix-jp版の日本語rpmの検証中なので、そこには反映されると思います。
KAZ - 投稿数: 1085
yorosikuさん
本家にバグ報告をしてきました。
1.6.7で対応してくれるようです。
また、zabbix-jp版の1.6系rpmでも対応予定です。
yorosiku - 投稿数: 20
kazさん
ありがとうございます。
調査ありがとうございました。
実際に試して、再度ご報告いたします。
追記です。
v1.4.6でも実際にソースファイルを直せば、
値は正確に取れるようになるでしょうか。
またそのファイル名は、
上記のproc.cファイルになるでしょうか。
(ファイル場所が見つからなかったもので)
KAZ - 投稿数: 1085
yorosikuさん
直ります。
一番最初の確認は1.4.6で行いました。
只、本家の修正方法とちょっと違うと言うことだけです。(笑)
<code>
またそのファイル名は、
上記のproc.cファイルになるでしょうか。
(ファイル場所が見つからなかったもので)
</code>
1.4系と1.6系ではソースのファイル配置が異なります。
1.4系は下記になります。
〜\zabbix-1.4.6\src\libs\zbxsysinfo\win32\proc.c