显示模式
系统服务保活
提示
在实践过程中发现极少门店的**系统服务(ChengDaService)**会发生停止的情况,服务停止之后监控的闸机和厨打就不工作了,对门店运营造成困扰。我们需要对系统服务进行保活,以保证服务正常运行,设置3秒检测一次,如果服务停止了,就自动重新启动。
一、批处理文件
可以直接点击下载Monitor保活脚本,也可以复制下面的脚本更改!
bat
rem 设置已管理员运行cmd命令
@echo off
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
rem 定义循环间隔时间和监测的服务,这里设置为3秒
set secs=3
rem 系统服务
set srvname="ChengDaService"
echo.
echo ========================================
echo == 查询计算机服务的状态, ==
echo == 每间隔%secs%秒种进行一次查询, ==
echo == 发现服务其停止,立即启动。 ==
echo ========================================
echo.
echo 此脚本监测的服务是:%srvname%
echo.
if %srvname%. == . goto end
:chkit
set svrst=0
rem 使用for 循环遍历当前系统上正在运行的服务列表。判断运行的服务列表里面是否存在 %srvname% ,匹配成功,则将 svrst 的值设置为 1。
for /F "tokens=1* delims= " %%a in ('net start') do (
if /I "%%a %%b" == %srvname% (
set svrst=1
)
)
rem 查询服务状态
echo 服务状态为:%svrst%
if %svrst% == 0 (
net start %srvname%
echo 服务 %srvname% 正常启动成功了。
)
rem 下面的命令用于延时,否则可能会导致cpu单个核心满载。
ping -n %secs% 127.0.0.1 > nul
goto chkit
:end
注意:需要把Bat脚本文件设置为ANSI编码,否则会出现控制台中文乱码的情况。
关于脚本本身的含义大家直接看脚本里面的注释就很清楚了,另外还增加了直接指定管理员命令运行Bat,这样避免直接双击运行Bat脚本而没有权限的问题。这部分脚本可以通用。大家如果编写了其他运维脚本也在首行可以加上这段,就可以实现自动以管理员身份运行。
bash
rem 设置已管理员运行cmd命令
@echo off
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
二、运行效果
我们把系统服务停止,然后运行bat脚本。
会首先检测到服务状态为0,然后马上开始启动服务。
服务启动后,重新执行Bat脚本,效果如下图
三、封装为服务的方式运行
建议把Bat脚本打包为Windows服务器的方式运行,如果直接使用cmd窗口运行的话,有被关掉的风险,使用后台运行的方式更加可靠。这里提供一种方式:
开源的Java工具winsw
使用它可以将任何可执行文件包装成Windows服务。你需要编写一个XML配置文件来指定批处理文件的位置和其他参数,然后用winsw.exe和配置文件一起创建服务。 下载地址:https://github.com/kohsuke/winsw/releases
- 这里的话我已经把相关配置修改好了,可以直接下载运行,有兴趣的可以去上面的地址去研究一下。 点击直接下载我已经配置好的服务保活文件,解压到D盘,里面包含两个文件:
其中xml文件里面有个文件路径,如果上面的bat文件跟文件里面的路径不一样,你需要修改一下。
- 安装服务 在cmd命令提示符中执行一下命令:
bash
服务保活.exe install
执行的时候要在程序所在文件夹的路径执行,一般需要先切换目录
Win11的powershell里面需要在前面添加 .\ 符号 安装成功打开服务管理Win+R,输入:services.msc,找到你的服务,说明服务已经安装了,记得把服务启动。
- 服务本身的保活
保活日志
在保活服务文件夹内可以看到记录的日志