如何检测Windows服务停止后自动启动?自动运行.bat批处理文件?

作者:西瓜程序猿

主页传送门: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)最后等待启动执行即可,也可以手动点击【运行】。

相关推荐
程序员鱼皮2 天前
刚毕业,去做边缘业务,还有救吗?
计算机·程序员·互联网·求职·简历
程序员鱼皮7 天前
不敢相信,Nginx 还能这么玩?
前端·后端·计算机·程序员·编程经验
程序员鱼皮8 天前
6 年 30k star,这个明星项目停止更新!
计算机·程序员·互联网·github·编程
程序员鱼皮16 天前
1024 程序员节,我做了个闯关小游戏!
前端·后端·计算机·程序员·互联网·编程·网站·代码
程序员鱼皮16 天前
鱼厂首档自制综艺《码王争霸赛》,8 年程序员竟被半年小白血虐?
计算机·程序员·互联网·编程
AEIC学术交流中心—李老师17 天前
【SPIE独立出版 | 往届会后3个半月检索】第四届电子信息工程与数据处理国际学术会议(EIEDP 2025)
人工智能·算法·计算机·ei检索·研究生·ei会议·国际学术会议
无名之逆1 个月前
大一计算机课程之线性代数
开发语言·线性代数·考研·计算机·面试·开发·期末
小小怪下士 XIA1 个月前
JAVA的ArrayList 和 LinkedList的区别
java·开发语言·计算机·程序员·arraylist·linkedlist·区别
程序员鱼皮1 个月前
高产胜那啥,带你上线我的新项目!
前端·后端·计算机·程序员·互联网·开发·项目·编程经验
无名之逆1 个月前
线性代数入门
开发语言·线性代数·考研·计算机·面试·期末·期末速成