Windows Serverでのファイル存在のチェックについて

お世話になります。何とか実現したいことがあり皆様のお力をお借りさせてください。

Windows Server上で特定のフォルダ内でバッチ処理を行っておりまして、処理の際に処理するファイルの動きが
(処理前)xxx.emlが多数存在している
(処理中)xxx.emlが一斉にxxx.eml_inProcess.xxx.x.xxxxxにリネームされる
(処理後)ファイルが削除される
となります。一度に処理されるファイル数は最大150ファイルになります。
xxxは任意の英数字で重複することはなく、どんな値になるかは処理開始されるまで分かりません。
また処理が終わったファイルから順次削除されていき、1サイクルバッチ処理が完了すると
「xxx.eml_inProcess.xxx.x.xxxxx」はフォルダ内から全て無くなります。

今回実現させたいというのが、バッチ処理の遅延を警告するために
任意の「xxx.eml_inProcess.xxx.x.xxxxx」が20分以上存在していた場合にアラートを出したいというものになります。

どうぞよろしくお願いします。

コメント表示オプション

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

仰る動作パターンですと、
xxx.eml_inProcess.xxx.x.xxxxx というファイルの数を定期的に数えるような
アイテムを作成し、20分間連続で1以上だったらエラー
‥というわけには行かないのですよね?

<動作フロー>
←ファイル数取得結果は0
aaa.eml が処理されはじめて aaa.eml.inProcess.xxx.x.xxxxx に変わり‥
←ファイル数取得結果は1
10分程度経過後に bbb.eml が対象ファイルとして増えて
←ファイル数取得結果は1
bbb.eml が処理されはじめて bbb.eml.inProcess.xxx.x.xxxxx に変わり‥
←ファイル数取得結果は2
aaa.eml.inProcess.xxx.x.xxxxx は処理完了して削除された
←ファイル数取得結果は1
bbbは未だ処理中
←ファイル数取得結果は1
bbb処理開始後からは20分経過していないけれど
aaa処理開始後の「1」と変化してからは20分経過   →誤検知される

個々のファイル毎に、zabbix に滞留状況を確認させるのは実質ムリでしょう
アイテム毎にファイル名を特定させて‥といったことも、ファイル名が不定な以上
不可能でしょうし、何よりアイテムをファイル名の数だけ作らないといけなくなります

この場合は、個々のファイルの存在などを確認することを
zabbix側にやらせるのは不適当なパターンだと思います

バッチ処理側で、1ループあたりの(150ファイル?処理に掛かる時間)が
20分を超えたらZabbixへ異常発生を通知するように実装するのがベストでしょう

バッチ処理側の改修が不可能なのであれば‥
find コマンドに -mtime オプションをつけるなどして、
30分以上古いタイムスタンプの inProcessxxxx ファイルを計数するような
スクリプトを作って定期的に実行し、それの数が1以上になったら‥という
検知をさせるのが現実的ではないかと思います

ユーザー funimaru の写真

fripper 様

早速のご回答ありがとうございます。

>仰る動作パターンですと、
>xxx.eml_inProcess.xxx.x.xxxxx というファイルの数を定期的に数えるような
>アイテムを作成し、20分間連続で1以上だったらエラー
>‥というわけには行かないのですよね?

この案で十分なんです。
バッチ処理開始時に存在しているxxx.emlファイルが一斉にxxx.eml_inProcess.xxx.x.xxxxxに変更されますので
20分以上経過して1つでもxxx.eml_inProcess.xxx.x.xxxxxがあればエラーにしたいと思っています。
この方法が分からずに困っております。

ユーザー mocha の写真

アイテム化までできているのであれば トリガのほうで {item.count(1200,0,"eq")}=0 で評価すればよいかと
要は 20分間 0であることが0回 すなわちファイルが常時1こ以上あれば条件成立ってかんじです

ユーザー funimaru の写真

mocha様

ご回答ありがとうございます。
すみません、そのアイテム化が分からないのです。
アイテムで
タイプ:zabbixエージェント
キー:vfs.file.exists[D:\Program Files\aaa\bbb\cc\*.eml_inProcess.*.*.*]
を設定したのですが10秒間隔で更新しているのですが返り値が0のままです。

「D:\Program Files\aaa\bbb\cc\」はバッチ処理の作業フォルダです。

キーの設定方法が違うのでしょうか?

ユーザー lilith relic の写真

微妙なつっこみですが、
「eml.inProcess」と「eml_inProcess」どちらでしょうか?

ユーザー funimaru の写真

lilith relic様

eml_inProcessになります。

ユーザー minayan の写真

vfs.file.existsはワイルドカードが使えません。
代替案としてsystem.runを使う方法があります。
タイプ:zabbixエージェント
キー:system.run[dir /A-D /B D:\Program Files\aaa\bbb\cc\*.eml_inProcess.* | find /C /V ""]
データ型:数値(整数)
説明:D:\Program Files\aaa\bbb\cc\*.eml_inProcess.*に該当するファイル名を取得し、その行数をカウントする
これでアイテムに見つかったファイルの数が格納されます。
念のため、コマンドプロンプトで「dir /A-D /B D:\Program Files\aaa\bbb\cc\*.eml_inProcess.* | find /C /V ""」とすればファイルの数が取れるか確認して見てください。
あとはトリガー条件「20分間でアイテムの数が0以上」で判定できるかと思います。

ユーザー fripper の写真

vfs.file.exists キーでは、ファイル名指定の部分にワイルドカードは利用できません
特定のファイルについて、完全フルパスを指定することで、そのファイルの存在・不在等を得るためのキーとなっています

ワイルドカードに合致するファイルの有無や、数を知るためのアイテムはZabbix標準では用意されていませんので
UserParameter 等で、独自のアイテムを定義する必要が有るかと思います

linux だと
cd /target/dir/path ; ls -1 '*.eml_inProcess.*.*.*' | wc -l
のような感じで計数できるのですが、Windowsターゲットでの良いコマンド組み合わせ等は
すぐに思い当たらず‥申し訳ありません

ユーザー funimaru の写真

vfs.file.existsではワイルドカードは使えなかったのですね。
私の早とちりでした。

minayan 様のキーでファイル数が取得できるところまで設定できました。
残るトリガー条件「20分間でアイテムの数が0以上」のヒントをいただけないでしょうか?
mocha様の 「{item.count(1200,0,"eq")}=0」をどう使えばいいのか試行錯誤しているのですが力不足で今一歩進みません。
どうぞよろしくお願いいたします。

ユーザー minayan の写真

当方の環境でも、ファイル滞留について似たような監視をしております。
直近○○分間の滞留ファイル数平均が○○を上回る場合に、障害としています。
トリガーのサンプルです。
{item.avg(1200)}>10
おそらく滞留ファイル数は変動する思います。
ですので、実際取れているファイル数を見ながら調整が必要がと思います。

ユーザー minayan の写真

トリガーでavgを使う理由ですが、
ファイル滞留数は最大150件から徐々に減少するわけですが、
アイテムを更新間隔1分で、トリガー:{item.count(1200,0,"eq")}=0の組合せですと、
場合によってはファイルの滞留数が0にならず、ずっとトリガーが発動したままとなります。
avgであれば、○○分間の平均で○○以上となるので、トリガーの頻発を抑えながらの監視ができるかと思います。
最新データでアイテムをグラフ表示で確認しながら、トリガーの閾値を調整してみてください。

ユーザー funimaru の写真

minayan様

コメントありがとうございます。
試行錯誤の中ヒントをいただき助かります。
いろいろ試してみます。

ユーザー funimaru の写真

その後の報告です。

system.run[dir /A-D /B D:\Program Files\aaa\bbb\cc\*.eml_inProcess.* | find /C /V ""]に
設定したところ、返り値0が取れないので確認したところ、
コマンドプロンプトで「dir /A-D /B D:\Program Files\aaa\bbb\cc\*.eml_inProcess.* | find /C /V ""」を実行すると
ファイル数0のときは「ファイルが見つかりません 0」という返り値になり
zabbix-Server.logを確認すると「became not supported: Received value [?t?@?C???????????????0] is not suitable for value type [Numeric (unsigned)] and data type [Decimal]」とエラーになり0という値が取れていませんでした。

やはりファイル数の平均値で取るしかないでしょうか。

ユーザー mocha の写真

Win10ですが 手元でお試ししてみたところ その「ファイルが見つかりません」といってるのは dirのようです
なので dirの標準エラー出力をnulにとばしちゃいましょぅ
つまり
「dir /A-D /B D:\Program Files\aaa\bbb\cc\*.eml_inProcess.* 2>nul | find /C /V ""」
でいけるんではないかと

ちなみに トリガで使う関数は 意味を理解したうえで使う分には countでもavgでもminでもいけます
「ファイル数の平均値で~」については 0がとれない状態で平均値をとっても 結局「0」となった要素が存在しない
状態での平均値なので まったく意味をなさないはず

ユーザー funimaru の写真

最終報告です。

mocha様の「dirの標準エラー出力をnulへ」を設定したところ、希望していた通りの動きをしてくれました。
当初の目的通りにzabbixがアラートを出すようになりました。

ここまでお付き合いいただいた方々に多大な感謝を申し上げます。
本当にありがとうございました。