2018年8月16日 星期四

偵測程式是否仍在執行,重新啟動並 Email 通知

最近因為工作需要,想設計一個機制:

  1. 持續檢查某個程序是否仍在執行。
  2. 若發現停止執行,重新啟動。
  3. 發現問題時以 Email 通知。

Google 了一下發現兩篇:參考一 參考二

第一個範例已經相當完整,指令模式下寄信使用了 SendEmail

流程圖:





以下是最後完整的BAT檔內容:
echo off
echo ******************** 啟動偵測 ************************* >>C:\Log\Detection.log
echo %date% %time% >>C:\Log\Detection.log
tasklist /FI "IMAGENAME eq xxx.exe" /FO CSV > C:\Log\Dtemp.log
FOR /F %%A IN (C:\Log\Dtemp.log) do if %%A == 資訊: goto process_off
:process_on
echo 程式偵測成功 >>C:\Log\Detection.log
goto end
:process_off
C:\sendEmail.exe -f fromuser@yyy.com -u [警告] 程式偵測失敗重新啟動 -m 程式偵測失敗,於 %date% %time% 嘗試重新啟動。 -t touser@yyy.com -s smtp.yyy.com:25 -o message-charset=big5 -o message-content-type=text -l C:\Log\SendEmail.log -o tls=no
echo 程式偵測失敗,重新啟動。 >>C:\Log\Detection.log
echo 發送通知信件至 touser@yyy.com >>C:\Log\Detection.log
start C:\xxx.exe
:end
echo ******************************************************* >>C:\Log\Detection.log

步驟如下:

  1. 建立一個BAT檔,內容如上。
  2. 自行建立目錄與 log 檔,替換上述的路徑。
  3. Detection.log 是執行紀錄,會一直累積。( >> 應該就是Append?)
  4. Dtemp.log 是偵測暫存紀錄,每次偵測都會覆寫。( > 應該就是覆寫)
  5. 偵測不到時,log 到的字串開頭會是"資訊",以此為判斷依據重新執行程序。
  6. 開發時可以先執行 tasklist 那行,確認偵測不到的字首是否為"資訊"兩個字。
  7. 綠色部分為發送 Email 相關,如無此需求可跳過,相關參數可參考官網。
  8. 中文內容我修改參數為 -o message-charset=big5 才成功,原本信件會亂碼。
  9. BAT最後請另存為ANSI,避免 log 檔中文亂碼,BAT也會無法執行。

最後請用系統的"工作排程器",增加一個排程定時執行此BAT即可。


ps. 執行檔名與路徑不可有中文,路徑內若有空白,前後要加上雙引號。