如何檢測Windows服務停止後自動啟動?自動執行.bat批次檔?

2023-12-05 15:00:20

作者:西瓜程式猿
主頁傳送門:https://www.cnblogs.com/kimiliucn


前言

想要確保你的Windows服務即使在崩潰後也能自動重啟嗎?這篇文章教你如何用一個小巧的批次處理指令碼來實現這一點。教你怎麼設定定時檢查,如果發現服務掛了,就立刻拉起來。跟著步驟做,讓你的服務穩定執行不再是難題!


某一天,一個開發者寫了一個訊息佇列消費端,部署到Windows服務上後,發現這個服務會不定時的無緣無故停止掉,既沒有紀錄檔也沒有任何事件能通知,就很詭異。在一個漆黑的夜晚,他找到了[西瓜程式猿],說幫他寫一個程式自動啟動執行Windows服務,這不就來了嘛!


一、檢測服務停止並自動開啟

1.1-思路

這裡主要就是寫一個.bat批次檔,然後迴圈監控一個特定的Windows服務,如果服務停止了則嘗試重新進行開啟它,並且每隔N秒(自定義)檢測一次服務的狀態。然後需要一直執行著這個批次檔。


2.2-原始碼

在自己電腦/伺服器中新建一個【xxx.bat】檔案,然後寫入以下程式碼,bat檔案可直接雙擊執行,寫好後可以自行執行看一下效果。

@echo off
rem 定義迴圈間隔時間和監測的服務:
set secs=60
set srvname="服務名"
 
echo.
echo ========================================
echo ==         查詢計算機服務的狀態,     ==
echo ==     每間隔%secs%秒種進行一次查詢,     ==
echo ==     如發現其停止,則立即啟動。     ==
echo ========================================
echo.
echo 此指令碼監測的服務是:%srvname%
echo.
 
if %srvname%. == . goto end
 
:chkit
set svrst=0
for /F "tokens=1* delims= " %%a in ('net start') do if /I "%%a %%b" == %srvname% set svrst=1
if %svrst% == 0 net start %srvname%
set svrst=
rem 下面的命令用於延時,否則可能會導致cpu單個核心滿載。
ping -n %secs% 127.0.0.1 > nul
goto chkit
 
:end


注意:


執行成功截圖(如果出現亂碼也沒關係):


二、自動執行.bat批次檔

我們知道上面檢測服務是否已停止的.bat批次檔需要一直執行著,也就是隻要將黑視窗關閉調,程式就停止了。所以我們需要將這個.bat檔案放在後臺一直保持執行著。[西瓜程式猿]這邊以部署在【任務計劃程式】作為例子,讓.bat檔案每1分鐘自動執行一次。然後是在Windows Server伺服器上執行(PC電腦上操作有細微區別)。


2.1-前期準備

前期要進行如下設定,不然可能會報"操作員或系統管理員拒絕了請求。(Ox800710EO)"等錯誤(如果不設定可能不會執行:定時任務未設定在一個有效的組內,或者定時任務所在使用者組使用者無效或無許可權),設定好後最好重啟一下電腦/伺服器,不然可能導致無法生效。
(1)首先輸入【win+R鍵,然後輸入 gpedit.msc 】或者直接搜尋【本地安全策略】。


(2)點選【本地策略——>使用者許可權分配——>允許本地登入】右擊,然後點選【屬性】。

然後點選【新增使用者或組】,在輸入物件名稱來選擇輸入框中輸入【Administrator】,然後點選【檢查名稱】,可能會多出一些字首或者下劃線,這個沒關係說明檢測到了。然後點選【確認】即可。


(3)點選【本地策略——>使用者許可權分配——>作為批次檔登入】右擊,然後點選【屬性】,然後步驟同上即可。

(4)點選【本地策略——>安全選項——>域控制器:允許伺服器操作者計劃任務】右擊,然後點選【屬性】

然後選擇【已棄用】,最後點選【確定】即可。


2.2-建立任務執行程式

(1)開啟【任務計劃程式】。


(2)然後點選【建立任務】,在【常規】Tab選項中,輸入【名稱】,勾選【不管使用者是否登入都要執行】,勾選【使用最高許可權執行】,不然可能導致沒有許可權執行該任務。


(3)在【觸發器】Tab選項中,點選【新建】來建立一個觸發器,也就是在什麼時間來執行這個任務。[西瓜程式猿]以每1分鐘來執行,持續時間為無限期。


(4)在【操作】Tab選項中,點選【新建】來建立一個觸發器,也就是要執行的具體任務。[西瓜程式猿]以執行.bat檔案作為例子。



(5)在【條件】Tab選項中,取消勾選【只有在計算機使用交流電源時才啟動此任務】。

(6)在【設定】Tab選項中,如果此任務已經執行,以下規則適用【停止現有範例】(根據自己需求進行選擇即可),最後點選【確認】任務就建立好了。

(6)最後等待啟動執行即可,也可以手動點選【執行】。