[AHK#99] 偵測並啟動Windows服務
2022-6-5 20:36:48 Author: jdev.tw(查看原文) 阅读量:35 收藏

3C設備

作者的敗家記錄,包含iPad、Nexus 7、Galaxy S3等iOS與Android相關電腦設備,也有中華電信ADSL網路與NAS設備等之應用技巧。

Windows學習誌

聚焦於Windows作業系統各個版本的使用經驗與操作技巧,有Windows XP、Windows Vista、Windows 7、Windows 8與Windows Server等不同版本。

檔案、資料夾管理

日常使用電腦時有很大的比例是在操作檔案與資料夾,在此分類裡作者介紹了增進作業效率的各式技巧與心得分享。

生產力工具

與工作效提升有關的各式工具、網站服務,例如Toodledo、Evernote、Google各式服務等之經驗分享。

閱讀筆記

作者於網站衝浪之際,特別轉貼有所感的文章,內容不限電腦科技,尚有不少人文社經之作。

首頁 » AutoHotkey鍵盤工具

作者: 日期: 2022/06/05 – 20:36:48尚無留言 | 瀏覽數: 7 / 7

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&gt;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. 教學影片

##

您可能也會有興趣的類似文章

標籤:


文章来源: http://jdev.tw/blog/7154/autohotkey-start-a-service
如有侵权请联系:admin#unsafe.sh