tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

Windowsで実行中のプロセスが落ちていたらメールする方法

いま運用している環境で、Becky君が常時メールを取っていないといけないようになっているんだけど、受信するメールが多すぎてたまにBeckyが落ちたりする。落ちたことに気づかないと後で困ったことになるので、プロセスを監視して落ちてたらメールを送るスクリプトを書いた。


最初BATファイルだけで完結すると思っていたんだけど、メールを送るコマンドというのは無いみたいなので、メール送信部分はVBScriptで書いた。

procwatch.bat

@echo off
tasklist | find %1 > NUL
if not errorlevel 1 (
  echo %1 is undead.
) else (
  echo %1 is ded.
  cscript //Nologo sendmail.vbs %1
)

sendmail.vbs

Rem args
name = WScript.Arguments.Item(0)

Rem mail settings
mailFrom  = "i_am_becky@tanamon.jp"
mailTo    = "mail_alert@tanamon.jp"
useRemote = true
server    = "mail.tanamon.jp"
port      = 25
useAuth   = false
username  = ""
password  = ""

Set msg   = CreateObject("CDO.Message")
msg.From     = mailFrom
msg.To       = mailTo
msg.Subject  = name + " is dead."
msg.TextBody = "Help me!"

If useRemote Then
  key = "http://schemas.microsoft.com/cdo/configuration/"
  msg.Configuration.Fields.Item(key + "sendusing") = 2
  msg.Configuration.Fields.Item(key + "smtpserver") = server
  msg.Configuration.Fields.Item(key + "smtpserverport") = port
  msg.Configuration.Fields.Item(key + "smtpauthenticate") = useAuth
  If useAuth Then
    msg.Configuration.Fields.Item(key + "sendusername") = username
    msg.Configuration.Fields.Item(key + "sendpassword") = password
  End If
  msg.Configuration.Fields.Update
End If

msg.Send

設定値は各自修正すること。
ローカルにIISSMTPサーバが起動していればuseRemote=falseでも(たぶん)動く。
あと、SMTP認証ありにもできるようにしたけど、環境が無いのでこっちもたぶん動く。

使い方

procwatch.bat "B2.exe"

で実行できる。実際にはタスク登録とかしておけば定期的に実行させるようにする。


VBScriptは初めて書いたんじゃないかと思う。
でもこのメール送信処理はきもいので2度と書かない。


追記
プロセスが強制終了された場合、強制終了ダイアログが表示されるが、その間はプロセスが残っているため、チェックにひっかからないみたい。そのため、強制終了ダイアログが表示されないように設定しておく必要があります。
@IT:Windows TIPS -- Hint:Microsoftへのエラー報告ダイアログを無効にする