1. 問題描述與需求
同事提了一個狀況,如何確保某個每天定時重新啟動的服務有正確的啟動,在遇到啟動異常且找不到明確原因後,最終提供了偵測與重新啟動的作法來處理,雖然不算是最好的解法,但至少多了一層保障。
簡單且明確的需求直接用AutoHotkey來處理。以先前介紹過的Gitea服務當範例。
2. 邏輯說明
偵測執行應用的作法有很多個,例如 #IfWinActive, ahk_exe, wt 或 if WinActive(“wt”) 等,但目前要偵測的是服務的執行狀態,最簡單的作法是執行 sc.exe query,取得sc的輸出結果,若執行狀態是STOPPED表示未啟動,再叫用 start_service.bat 啟動之。
2.1. sc.exe
[!REF] sc用法
功能: SC 是一個用來和服務控制管理員及服務溝通的命令列程式
語法:sc <server> [command] [service name] <option1> <option2>...
command: query – 查詢服務的狀態,或列舉服務類型的狀態
Z:\test\gitea>sc query gitea
SERVICE_NAME: gitea
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
2.2. 啟動批次檔
啟動服務可以用傳統的 net.exe 或 sc start 命令,此處用 net.exe。
net start gitea
3. 腳本原始碼
- 將sc query 服務名導出到chk-is-running.txt
- 讀取chk-is-running.txt檔案,找到STATE字串,判斷它的值是否是RUNNING,不是RUNNING就執行start_service.bat
;; chk-is-running 服務名稱 系統目錄 啟動批次檔名
;; chk-is-running gitea z:\test\gitea start_service.bat
#SingleInstance Force
ServiceName = %1% ;; "gitea"
ServiceDir = %2% ;;"z:\test\gitea" ;; 系統目錄
StartBat = %3% ;;"start_service.bat" ;; 啟動服務的批次檔
ServiceChk = sc query "%ServiceName%" > %ServiceDir%\chk-is-running.txt
runwait, %COMSPEC% /C %ServiceChk%, ,Hide
FileRead, FileContent, %ServiceDir%\chk-is-running.txt
Loop, Parse, FileContent, `n,`r
{
FileLine = %A_LoopField%
Lookfor = STATE
IfInString, FileLine, %LookFor%
{
StringGetPos, pointer, FileLine, :
StringRight, ServerStatus, FileLine, StrLen(FileLine) - pointer - 5
if (ServerStatus == "RUNNING") {
FileAppend, % PID . " " . A_YYYY . "-" . A_MM . "-" . A_DD . " " . A_Hour . ":" . A_Min . ":" . A_Sec . " " . ServiceName . " is running " . " `n", %ServiceDir%\chk-is-running.log
} else {
Run, %ServiceDir%\%StartBat% , %ServiceDir%, Hide|UseErrorLevel, PID
;;MsgBox %ErrorLevel%
FileAppend, % PID . " " . A_YYYY . "-" . A_MM . "-" . A_DD . " " . A_Hour . ":" . A_Min . ":" . A_Sec . " After net start " . ErrorLevel . " `n", %ServiceDir%\chk-is-running.log
}
}
}
Return
4. 相關鏈接
5. 教學影片
##您可能也會有興趣的類似文章
- Windows虛擬桌面操作攻略;搭配強化工具更方便! [AHK#43] (0則留言, 2021/02/28)
- 用AutoGUI來學習AutoHotkey!超級簡單!(AHK #1) (0則留言, 2019/05/14)
- 輕鬆學會彈指神功-揭露AutoHotkey絕技 (59則留言, 2008/04/10)
- 用AutoHotkey擷取螢幕並存成檔案-簡單的截圖操作 (0則留言, 2019/11/02)
- [AHK#49] 整批多語言翻譯的2個方法:Google試算表與AutoHotkey脚本 (0則留言, 2021/10/15)
- [AutoHotkey] 寫得不錯的AutoHotkey推薦文 (5則留言, 2007/10/31)
- [AHK#38] 快速跳過片頭的按鍵操作─PotPlayer輸入移動位置 (0則留言, 2020/10/04)
- 由零開始寫一次關閉多個同名程式的 AutoHotkey腳本(AHK #10) (0則留言, 2019/07/14)
- [Tools] 操作熱鍵與熱字串的超便利工具:AutoHotKey (13則留言, 2005/04/29)
- AutoHotkey腳本的4種除錯方法(AHK #5) (0則留言, 2019/05/25)
- 如何轉換AutoHotkey的預設分隔字元:冒號 (2則留言, 2008/03/17)
- PhraseExpress:凡人版的AutoHotkey [修訂] (0則留言, 2009/11/28)
- [Tools] 加快鍵入速度的「片語特快車」 (2則留言, 2006/07/17)
- [AHK#36] 自製AutoSub圖形介面工具:AutoSub-AHK;Windows適用 (7則留言, 2020/05/15)
- 快速建立個人常用詞庫-AutoHotkey 熱字串小工具:HotString Helper(AHK #3) (0則留言, 2019/05/18)