Skip to content

系统服务保活

提示

在实践过程中发现极少门店的**系统服务(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,然后马上开始启动服务。 20240717095612

服务启动后,重新执行Bat脚本,效果如下图 20240717095833

三、封装为服务的方式运行

建议把Bat脚本打包为Windows服务器的方式运行,如果直接使用cmd窗口运行的话,有被关掉的风险,使用后台运行的方式更加可靠。这里提供一种方式:

开源的Java工具winsw

使用它可以将任何可执行文件包装成Windows服务。你需要编写一个XML配置文件来指定批处理文件的位置和其他参数,然后用winsw.exe和配置文件一起创建服务。 下载地址:https://github.com/kohsuke/winsw/releases

  1. 这里的话我已经把相关配置修改好了,可以直接下载运行,有兴趣的可以去上面的地址去研究一下。 点击直接下载我已经配置好的服务保活文件,解压到D盘,里面包含两个文件: 20240717100303

其中xml文件里面有个文件路径,如果上面的bat文件跟文件里面的路径不一样,你需要修改一下。 20240717100510

  1. 安装服务 在cmd命令提示符中执行一下命令:
bash
服务保活.exe install

执行的时候要在程序所在文件夹的路径执行,一般需要先切换目录 20240717114102

Win11的powershell里面需要在前面添加 .\ 符号 20240717113757 安装成功打开服务管理Win+R,输入:services.msc,找到你的服务,说明服务已经安装了,记得把服务启动。 20240717113730

  1. 服务本身的保活

20240717115256

  1. 保活日志

    在保活服务文件夹内可以看到记录的日志 20240717115507