exeファイルの監視

windowsserver2003にてウィンドウズ標準ではないexeファイルを
監視したりするためには何が必要になるのでしょうか?

また、別の話になりますがアラートメールを設定する際、
外部のメールサーバを指定してメールを送信する事はできますでしょうか?

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー KAZ の写真

yorosikuさん

windowsserver2003にてウィンドウズ標準ではないexeファイルを
監視したりするためには何が必要になるのでしょうか?

ウィンドウズ標準ではないexeファイルの何を監視したいのでしょうか?

また、別の話になりますがアラートメールを設定する際、
外部のメールサーバを指定してメールを送信する事はできますでしょうか?

今後は1質問1種類の書き込みでお願いします。
ちなみに、外部のメールサーバとsmtpのポート25で接続できれば外部のメールサーバでもOKです。

ユーザー yorosiku の写真

返答ありがとうございます。

exeファイルのプロセスを監視したいと考えています。
録音システムの構築をしているのですが、
録音する為のファイルのいくつかのexeファイルがあり、
正常にプロセスが起動されているかどうかを監視したいと考えています。

ユーザー KAZ の写真

yorosikuさん

「proc.num[{exeの名前}]」でプロセス数が取得できますので、プロセスが起動されているかどうかは0か1以上かで判別できます。

が、「正常にプロセスが起動されているかどうか」は判別できないかと。ログに状態を出力させ、そのログを監視する等の仕組みが必要かと。

ユーザー yorosiku の写真

kazさん
kodaiさん

アドバイスありがとうございます。
確かにプロセスが正常に動いているかどうかを判断する監視方法は
別途考えていかなければならないと思っています。

プロセスが起動しているかの判断ですが、
Windowsのサービスに登録してあるものを、トリガーの設定にて
以下のように設定してみましたが設定できませんでした。

{ホスト名:proc.num[iPod Service].last(0)}=0

[ERROR: トリガーを追加できません]
No such monitored parameter (proc.num[iPod Service]) for host (ホスト名)

num の後に追加する名前を{}でくくったり、実行ファイルのパスを指定してみたりしましたが、上記エラーがでてしまいます。

設定方法で何か誤っている点はありますでしょうか。

ユーザー kodai の写真

こんにちは。

プロセスが起動しているかの判断ですが、
Windowsのサービスに登録してあるものを、トリガーの設定にて
以下のように設定してみましたが設定できませんでした。

{ホスト名:proc.num[iPod Service].last(0)}=0

このトリガーに指定しているproc.num[iPod Service]のアイテム設定が存在していないためだと思います。

ZABBIXの監視から障害検知はホスト->アイテム->トリガーという流れで設定を行う必要がありますので、マニュアルなどを参照してアイテムの設定後に上記のトリガーを設定するとうまくいくと思います。

あと、試していないのですが、proc.num[]ではなくproc_info[]でないとプロセスの情報は取得できないかもしれません。詳細はマニュアルのアイテムの項を参照してみてください。

ユーザー yorosiku の写真

kodaiさん

アドバイスありがとうございます。

マニュアル参照し、試して見たいと思います。

ユーザー KAZ の写真

TO:kodaiさん
CC:yorosikuさん

あと、試していないのですが、proc.num[]ではなくproc_info[]でないとプロセスの情報は取得できないかもしれません。詳細はマニュアルのアイテムの項を参照してみてください。

WindowsXpの環境ですが、下記でブラウザ「Chrome」のプロセス数が取れました。
<code>
■アイテム
タイプ :ZABBIXエージェント
キー  :proc.num[chrome.exe]
データ型:数値(整数)
</code>

同じくWindowsXPですが、Chromeの使用メモリ合計が取れました、
<code>
■アイテム
タイプ :ZABBIXエージェント
キー  :proc_info[chrome.exe,wkset,sum]
データ型:数値(整数)
</code>

ユーザー yorosiku の写真

kazさん、アドバイスありがとうございます。

chromeのプロセス監視が出来ました。

使用メモリの合計値も取れたのですが、
サーバのウェブ画面の最新の値で表示されている数値が79,684。
エージェント側のタスクマネージャで表示されているメモリ数値が
36,668k+5,554k=42,222k(exe2つ分)でした。

これは値が正確に取れていないのでしょうか。
それとも別の要素があるのでしょうか。

ユーザー KAZ の写真

yorosikuさん

これは値が正確に取れていないのでしょうか。
それとも別の要素があるのでしょうか。

zabbix1.4.6で確認したところ、sumの動作がおかしいことがわかりました。プロセスが1つだと2倍になってました。3つ以上だと2倍じゃないような気がします。(更新頻度等で正確な計算ができなく…)

ソースを確認してみます。
(ちょっと時間がかかるかもしれません。)

ユーザー KAZ の写真

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 の写真

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 の写真

yorosikuさん

本家にバグ報告をしてきました。
1.6.7で対応してくれるようです。

また、zabbix-jp版の1.6系rpmでも対応予定です。

ユーザー yorosiku の写真

kazさん

ありがとうございます。

調査ありがとうございました。

実際に試して、再度ご報告いたします。

追記です。

v1.4.6でも実際にソースファイルを直せば、
値は正確に取れるようになるでしょうか。

またそのファイル名は、
上記のproc.cファイルになるでしょうか。
(ファイル場所が見つからなかったもので)

ユーザー KAZ の写真

yorosikuさん

v1.4.6でも実際にソースファイルを直せば、
値は正確に取れるようになるでしょうか。

直ります。
一番最初の確認は1.4.6で行いました。
只、本家の修正方法とちょっと違うと言うことだけです。(笑)

<code>
またそのファイル名は、
上記のproc.cファイルになるでしょうか。
(ファイル場所が見つからなかったもので)
</code>
1.4系と1.6系ではソースのファイル配置が異なります。
1.4系は下記になります。
〜\zabbix-1.4.6\src\libs\zbxsysinfo\win32\proc.c