Windowsのリモートコマンドについて

Windowsのリモートコマンドについてお助けください。

【やりたいこと】
 ・WindowsサーバのOracleListenerLogファイルサイズをZabbixで監視し,閾値サイズを超過した場合,
  あるバッチファイルを実行したい。

【困っていること】
 ・ファイルサイズを監視するアイテムとトリガー設定まではうまくいきましたが,アクションでWindowsサーバ
  に保存しているバッチファイルを実行できない(リモートコマンドでバッチファイルを実行)。

【前提条件】
 ・Zabbix:2.2.8を利用
 ・対象のWindows:Windows2003,Windows7
 ・対象Windowsのzabbix_agentd.confでLogRemoteCommandsは1にしている
 ・対象WindowsのAgentLogファイルにはバッチファイルを実行しているログが記録されている
   5748:20150106:203337.350 Executing command 'c:\start.bat'
   5632:20150106:203437.381 Executing command 'c:\start.bat'
   5748:20150106:203537.482 Executing command 'c:\start.bat'
  5748:20150106:203637.509 Executing command 'c:\start.bat'
  4872:20150106:203737.540 Executing command 'c:\start.bat'
  5748:20150106:203837.580 Executing command 'c:\start.bat'
    ※60秒インターバルで無限実施時
 ・Windows7はUACは無効

【やってみたこと】
 ・start.batファイルの中身を
   c:\windows\system32\shutdown.exe -r -f
  にすると,バッチファイルが実行され,再起動がかかる。
 ・start.batファイルの中身を
  [c:\windows\system32\notepad.exe]
  [dir c:\>Samplefile.txt]
  [C:\Windows\System32\mstsc.exe]
  など,いろいろ変えて実行してみましたがすべてダメ。
 ・ちなみに該当のWindowsサーバ[ファイル名を指定して実行]で[c:\start.bat]とすると正常に実行される

 なんとなく,原因はZabbixではなくWindowsのような気がしますが,Webで調べてもそれらしいものに
ヒットしません。

 お助け願います。

コメント表示オプション

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

コンソール・GUIの有無に影響を受けているのではないでしょうか?

zabbix_agentd はサービス登録によって起動されているので、GUIがありません
そのため、notepad 等、ウィンドウ出力が必要なものはすべて失敗するのではないかと思います

shutdown.exe は、GUI・コンソールがあってもなくても動作するように作られているから
正常に動作するのではないでしょうか

#具体的な対策方法は思いつきません。他の知見の有る方、何かありますでしょうか?

コメントありがとうございます。

 いただいた情報でWebで調べてみますと,確かにサービス起動したものはセッション0となり,
ログインユーザーのセッション1と異なるようで,GUIは使えないようです。

 バッチファイルの内容を,notepad等ウィンドウの表示のないものに変えて実行してみました。
 
 がっ,うまく動作しません。

 バックグラウンドで正常に処理しているのかと思い,以下の内容のテストを実施しました。

【バッチファイル】※ファイル名を変更し,バックアップファイルの作成
 echo off

 SET LOGNAME=listener
 SET time2=%time: =0%
 SET NOWTIME=%date:~-10,4%%date:~-5,2%%date:~-2,2%_%time2:~0,2%%time2:~3,2%%time2:~6,2%
 SET BKLOGNAME=BK_%NOWTIME%_%LOGNAME%.log
 SET WKLOGNAME=WK_%NOWTIME%_%LOGNAME%.log
 SET MAINLOGNAME=%LOGNAME%.log

 rename %MAINLOGNAME% %BKLOGNAME%
 copy %BKLOGNAME% %MAINLOGNAME%

 以上 よろしくおねがいします。

ユーザー fripper の写真

バッチファイルを起動する際の「カレントディレクトリ」が
普段、実行する際と異なっていて、うまく動作していないのではないでしょうか?

記載いただいているバッチ処理の内容をみる限り、対象のログファイルは
カレントディレクトリに存在する前提で書かれているように見られます

zabbix からは、フルパス指定で実行されるので、スクリプト自身は実行されますが
その際、カレントディレクトリはスクリプトのあるフォルダには設定されないはずなので
対象のログファイルが見つからずに処理がうまくいっていないのではないかと。

先頭付近に、

cd C:\hogehoge

など書いて、スクリプト内で、対象ログがあるディレクトリへカレントディレクトリを
移動するように書いてみてどうでしょう?

ユーザー tomopa2 の写真

的外れかもしれませんが、バッチを直接実行するのではなく
cmdからバッチを呼び出すようにしてみるとか。

c:\windows\system32\cmd.exe /c D:\zabbixaction\Action.bat

ユーザー zinten の写真

ken.tさん

Zabbixサーバからzabbix_getコマンドを実行してみてください。
何かエラーとか出てませんか?

# zabbix_get -s <監視対象のIP> -k system.run[c:\\start.bat,wait]

fripperさん,tomopa2さん,zintenさん コメントいただきありがとうございます。

八方塞の状況でいただける情報はありがたいです。

さて,順にお答えします。

1.「カレントディレクトリ」が・・・
 今回,動作の確認するためにCドライブ直下にバッチファイルを置き,ログファイルも置いてあります。
 ご指摘の通り,Oracleのログは別な場所にあります。(前提を記載しておりませんでした。すみません。)
 よって,本質的な原因はこれではないようです。

2.cmdからバッチを呼び出す・・・
 アクションの設定で,バッチファイルからコマンド実行に変更してみましたがダメでした。

3.zabbix_getコマンド
 ・zabbix_getコマンドを実行したところ,「コマンドが見つからない」と言われたので,インストール
  しました。
 ・いただいた,
    # zabbix_get -s <監視対象のIP> -k system.run[c:\\start.bat,wait]
  を投入したところ,
    ZBX_NOTSUPPORTED
  となりました。
  この時のAgentがわのログを確認すると,
    Executing command 'c:\start.bat'
  とあり,Agentにはコマンドが届いているようです。

  ちなみに,
    # zabbix_get -s <監視対象のIP> -k system.cpu.util[0,system,avg5]
  と投入すると,正常に値が取得できます。

  さらに,
  リブート処理をバッチファイルに書いた場合は,正常に動作したことから
    # zabbix_get -s <監視対象のIP> -k system.run[c:\\test_Reboot.bat]
  と投入すると,
    C:\Windows\system32>c:\windows\system32\shutdown.exe -r -f
  とバッチファイルに記載したものが帰ってきて,正常に再起動が実施されました。

  再度,他のバッチファイルも同様に試してみると,再起動と同じようにバッチファ
 イルの記載内容を返してきているようですが,文字化けします。
  文字化け時にメッセージウィンドウが表示され,シリア語を検索するか聞いてきて,
 検索ボタンを押すのですが,うまく見つかりません。

 バッチファイルの文字コードが原因かと思い,SJISからUTF-8にしてみましたが結果は
変わらずでした。
 

ユーザー zinten の写真

ken.tさん

プログラムが実行されているのに「ZBX_NOTSUPPORTED」が返るのは
おそらく「echo off」にしているのでバッチが標準出力に何も文字列を返していないからかと。

system.run[command,wait]は、ファイルが標準出力に何も返さない場合は「ZBX_NOTSUPPORTED」になります。
一時的に確認のために「echo off」をはずしてみてもらえますか?

また、プログラム実行に時間がかかる場合等はagentd.confのTimeoutパラメータ等も見直してみるといいと思います。

echoを外したところ,下記の帰り値の表示がありました。

 C:\Windows\system32>SET LOGNAME=listener

 C:\Windows\system32>SET time2=18:14:32.33

 C:\Windows\system32>SET NOWTIME=20150108_181432

 C:\Windows\system32>SET BKLOGNAME=BK_20150108_181432_listener.log

 C:\Windows\system32>SET WKLOGNAME=WK_20150108_181432_listener.log

 C:\Windows\system32>SET MAINLOGNAME=listener.log

 C:\Windows\system32>rename listener.log BK_20150108_181432_listener.log
 �肳�ꂽ�t�@�C�������‚����܂����B

 C:\Windows\system32>copy BK_20150108_181432_listener.log listener.log
 �肳�ꂽ�t�@�C�������‚����܂����B

 きちんと変数は処理されているようですが,肝心のrenameがエラーになっている?(文字化けでわからない)

 という結果になりました。

ユーザー KAZ の写真

ken.t ¡さん

>echoを外したところ,下記の帰り値の表示がありました。
zabbix_getですか?

因みにZabbixはUTF-8ですけど、WindowsはSHIFT-JISですね。

KAZさん

 投入コマンドはzabbix_getです。

 文字コードはご指摘の通りです。
   ※ただ,バッチファイルの文字コードをutf-8のものを作成しましたが結果に変化はありませんでした。

【追加情報】
  ・上記の文字化けの内容がわかりました。

   「指定されたファイルが見つかりません。」と表示されています。

  ますます,わからなくなりました。

原因がわかりました。

コマンド投入後,

 C:\Windows\system32>SET LOGNAME=listener

 C:\Windows\system32>SET time2=19:40:17.86

 C:\Windows\system32>SET NOWTIME=20150108_194017

 C:\Windows\system32>SET BKLOGNAME=BK_20150108_194017_listener.log

 C:\Windows\system32>SET WKLOGNAME=WK_20150108_194017_listener.log

 C:\Windows\system32>SET MAINLOGNAME=listener.log

 C:\Windows\system32>rename listener.log BK_20150108_194017_listener.log
 指定されたファイルが見つかりません。

 C:\Windows\system32>copy BK_20150108_194017_listener.log listener.log
 指定されたファイルが見つかりません。

 と表示されたため,

 カレントディレクトリに該当ファイルがない。との気づきで,cdコマンドを間に挿入することで

正常に実行することの確認が取れました。

 それ以外のGUI系のコマンドについては調査してみようと思います。

ユーザー zinten の写真

ken.tさん

サービスからGUIを使用するプログラムを動かす場合、
「Zabbix Agent」サービスのプロパティを開いて、
「ログオン」タブの「デスクトップとの対話をサービスに許可」にチェックを入れるとできたはずです。

zintenさんコメントありがとうございます。
 
 ご教示いただいた,設定をしたのちに下記の2つのバッチファイルを実行してみましたが

正動作なのかわかりません。

ファイル1
 c:\windows\system32\notepad.exe
 pause

ファイル2
 C:\Windows\System32\mstsc.exe

 zabbix_getコマンドで実行すると,
  ZBX_NOTSUPPORTED
 と帰ります。

 コマンド実行するWindows上では,一瞬[対話型のサービスの検出]が起動し2秒程度で
消滅します。 
 
 Windowsのデスクトップにはnotepadもmstcも表示されません。

ユーザー zinten の写真

ken.tさん

>zabbix_getコマンドで実行すると,
> ZBX_NOTSUPPORTED
>と帰ります。
system.run[]で第二引数にwaitを指定した場合、
コマンドが何らかの出力を返さないと「ZBX_NOTSUPPORTED」になってしまいます。

>コマンド実行するWindows上では,一瞬[対話型のサービスの検出]が起動し2秒程度で消滅します。 
2秒くらいで消えるのはsystem.run[]でwaitを指定した場合、
zabbix_agentd.confのTimeoutのパラメータの時間まで実行して終了しない場合、
強制的にプロセスがkillされます。
Timeoutは最大で30まで伸ばせますのでそれ以上かかる場合は、
system.run[]の第二引数をnowaitにすることで回避できます。

>Windowsのデスクトップにはnotepadもmstcも表示されません。
サービスで動かすとバックグラウンド(?)で動くので
現在ログインしているユーザでは表示されなかったかと。。。
現在ログインしているユーザでどうしても表示したいときは、
ログイン後にコマンドプロンプトより、「zabbix_agentd.exe -c zabbix_agentd.conf」のような感じで
ログインユーザがプロセスを起動してあげる必要があるのかと。。。

zintenさん情報ありがとうございます。

 いただいた情報での確認結果をご連絡します。

■waitをnowaitに・・・。

 ・本対応により『ZBX_NOTSUPPORTED』の表示から『1』になりました。

■zabbix_agentd.exe -c zabbix_agentd.confにより画面表示

 ・あらかじめ,上記コマンドを投入することで,リモートコマンドを投入すると,
  対話型サービスの検出ウィンドウが表示され,[メッセージの表示],[後で確認します]を
  選択する画面が表示されるようになりました。

  [メッセージの表示]を選択すると,グレーの画面表示となり,指定プログラムが起動して
  いる画面表示が表示され,正常に動作していることの確認ができました。

 とりあえず,GUI系のコマンド実行についても判明したため,本件はクローズとさせてもらいます。

 有益な情報をいただいた皆様に感謝申し上げます。