运维实战:Windows服务挂掉了怎么办,通过Bat脚本实现自动重启

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本文介绍了如何使用Bat脚本自动监控并重启Windows服务器上的挂掉服务,例如MySQL,以避免在假期等情况下需要紧急处理问题。首先,创建一个Bat脚本,设定每小时检查一次服务状态,如果服务停止则自动重启。脚本内容包括检查服务是否运行并根据状态执行相应操作。同时,脚本中包含了确保以管理员权限运行的代码。脚本需设置为ANSI编码以防止乱码。推荐将Bat脚本封装为Windows服务以保证稳定运行,提供了使用NSSM工具、Windows服务程序和开源的Java工具winsw将批处理脚本转化为服务的方法。这些方法可以确保服务在后台可靠运行,即使在服务意外停止时也能自动恢复。

       image.png                                      

大家在日常运维当中,如果Windows服务器的服务挂掉了怎么办,比如数据库、Tomcat、Redis等等。再比如赶上周末放假的话,是不是还需要紧急处理问题,然后一整天的好心情也就没有了,有没有什么好办法来解决这个问题呢。这里给大家介绍通过Bat脚本的方式,实现异常Windows服务的重启,这样再也不用担心服务器因为应用服务挂掉,还需要火急火燎的处理问题了。当然前提是你的应用服务应该配置为Windows服务的方式启动。大家一起来看看吧!

一、新建Bat脚本文件

这里用mysql服务为例,来进行案例介绍。设置每小时监控一次,如果服务挂掉,就自动重启。当然大家可以根据实际的需求设置定时监控的频率。

image.png

脚本内容如下:

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 定义循环间隔时间和监测的服务,这里设置为1小时
set secs=3600
rem 这里已mysql服务为案例
set srvname="mysql"
 
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脚本而没有权限的问题。这部分脚本可以通用。大家如果编写了其他运维脚本也在首行可以加上这段,就可以实现自动以管理员身份运行。

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" )

二、运行效果

这里我们把mysql服务停掉,然后执行Bat脚本。

image.png

启动成功之后的效果

image.png

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

image.png

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

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

3.1 NSSM

使用nssm(Non-Sucking Service Manager)工具来将.bat脚本转换为服务。具体如何操作,可以官网查看。

官网:http://www.nssm.cc/usage

3.2 Windows服务程序

将批处理脚本作为Windows服务运行的方法是编写一个简单的Windows服务程序,然后在该服务程序中调用批处理文件

创建一个C# Windows服务项目,并在其中添加对批处理文件的调用逻辑。以下是一个简化版的服务类示例:

using System;
using System.Diagnostics;
using System.ServiceProcess;
public partial class BatchService : ServiceBase
{
    public BatchService()
    {
        InitializeComponent();
    }
    protected override void OnStart(string[] args)
    {
        ExecuteBatchFile();
    }
    private void ExecuteBatchFile()
    {
        try
        {
            // 替换为你的批处理文件路径
            string batFilePath = @"Bat脚本路径";
            Process.Start(new ProcessStartInfo("cmd.exe", $"/c {batFilePath}") { CreateNoWindow = true });
        }
        catch (Exception ex)
        {
            EventLog.WriteEntry("BatchService", $"Error executing batch file: {ex.Message}", EventLogEntryType.Error);
        }
    }
    // 其他服务方法如OnStop等...
}

将该项目编译成.exe可执行文件,然后通过命令行工具 sc 或者安装util(在.NET Framework中可用)将这个.exe注册为系统服务。

sc create YourServiceName binPath= "C:\path\to\your\compiled_service.exe" start= auto DisplayName= "Your Service Display Name"

3.3 开源的Java工具winsw

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

下载地址:https://github.com/kohsuke/winsw/releases

<service>
  <id>your-service-name</id>
  <name>Your Service Display Name</name>
  <description>Description of your service</description>
  <executable>C:\Windows\System32\cmd.exe</executable>
  <arguments>/c bat脚本完整路径</arguments>
</service>

将winsw.exe重命名为带有.exe扩展名的服务名称,如your-service-name.exe,这样它就能读取同目录下的your_service.xml配置文件。

使用命令行工具 sc 注册服务:

sc create YourServiceName binPath= "C:\path\to\your_service\your-service-name.exe" start= auto DisplayName= "服务名称"

注意:这种方法还是间接地将批处理文件作为服务运行,而不是直接将批处理文件注册为服务。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
|
3月前
|
边缘计算 安全 网络安全
|
3月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
111 9
|
3月前
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
102 0
|
3月前
|
弹性计算 关系型数据库 网络安全
阿里云国际版无法连接和访问Windows服务器中的FTP服务
阿里云国际版无法连接和访问Windows服务器中的FTP服务
|
3月前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
70 4
|
2月前
|
机器学习/深度学习 运维 监控
智能化运维:从自动化到AIOps的演进之路####
本文深入探讨了IT运维领域如何由传统手工操作逐步迈向高度自动化,并进一步向智能化运维(AIOps)转型的过程。不同于常规摘要仅概述内容要点,本摘要将直接引入一个核心观点:随着云计算、大数据及人工智能技术的飞速发展,智能化运维已成为提升企业IT系统稳定性与效率的关键驱动力。文章详细阐述了自动化工具的应用现状、面临的挑战以及AIOps如何通过预测性分析和智能决策支持,实现运维工作的质变,引领读者思考未来运维模式的发展趋势。 ####
|
2月前
|
机器学习/深度学习 数据采集 人工智能
智能化运维:从自动化到AIOps的演进与实践####
本文探讨了智能运维(AIOps)的崛起背景,深入分析了其核心概念、关键技术、应用场景及面临的挑战,并对比了传统IT运维模式,揭示了AIOps如何引领运维管理向更高效、智能的方向迈进。通过实际案例分析,展示了AIOps在不同行业中的应用成效,为读者提供了对未来智能运维趋势的洞察与思考。 ####
93 1
|
2月前
|
机器学习/深度学习 数据采集 人工智能
智能运维:从自动化到AIOps的演进与实践####
本文探讨了智能运维(AIOps)的兴起背景、核心组件及其在现代IT运维中的应用。通过对比传统运维模式,阐述了AIOps如何利用机器学习、大数据分析等技术,实现故障预测、根因分析、自动化修复等功能,从而提升系统稳定性和运维效率。文章还深入分析了实施AIOps面临的挑战与解决方案,并展望了其未来发展趋势。 ####
|
2月前
|
机器学习/深度学习 数据采集 运维
智能化运维:机器学习在故障预测和自动化响应中的应用
智能化运维:机器学习在故障预测和自动化响应中的应用
64 4

热门文章

最新文章