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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 本文介绍了如何使用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= "服务名称"

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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
机器学习/深度学习 数据采集 人工智能
智能运维:AI在现代IT服务管理中的应用
【6月更文挑战第17天】随着人工智能技术的不断进步,智能运维已成为提升IT服务效率和质量的关键手段。本文将探讨如何通过集成机器学习、大数据分析等技术来优化传统运维流程,实现故障预测、自动化处理及持续的性能优化,旨在为IT专业人士提供实施智能运维的洞见与策略。
|
2天前
|
开发框架 前端开发 调度
C#基于Quartz.NET实现任务调度并部署Windows服务
C#基于Quartz.NET实现任务调度并部署Windows服务
|
8天前
|
机器学习/深度学习 存储 人工智能
智能化运维:未来的IT服务管理
【6月更文挑战第14天】本文将探讨智能化运维的概念、优势以及在IT服务管理中的应用。随着人工智能和机器学习技术的发展,智能化运维已经成为了IT服务管理的新趋势。通过引入智能化运维,企业可以提高效率、降低成本并提升服务质量。
|
19天前
|
程序员 Windows
程序员必备技能:一键创建windows 服务
该内容是关于在Windows上创建服务的教程。通过一个BAT脚本示例,用户可以将程序设置为开机启动或持续运行的服务。脚本设置了服务名称、显示名和描述,并指定了程序路径和参数。将代码保存为.bat文件,以管理员权限运行,即可创建服务。之后在Windows服务管理中找到并启动该服务。
|
1月前
|
运维 Linux 程序员
最全树莓派4B安装64位Linux(不用显示器键盘鼠标),Linux运维面试送分题
最全树莓派4B安装64位Linux(不用显示器键盘鼠标),Linux运维面试送分题
最全树莓派4B安装64位Linux(不用显示器键盘鼠标),Linux运维面试送分题
|
20天前
|
运维 Linux Shell
运维:Linux服务器崩了怎么办,快来看看这份”急救命令指南“吧!
当服务器出现问题,如崩溃、内存耗尽或CPU使用率过高时,运维工程师需要保持冷静,并通过一系列Shell命令来诊断和解决。首先,检查是否有异常SSH登录活动,查看`/etc/passwd`和`.bash_history`文件,以及用户最近的登录信息。接着,监控网络连接和端口,使用`netstat`和`lsof`命令找出资源占用高的进程,并查看进程启动时间和详细信息。同时,排查可能的恶意文件,检查定时任务和服务配置以确保没有异常启动项。最后,分析系统日志,如`/var/log`目录下的各种日志文件,找出潜在问题。通过这些步骤,可以有效定位和解决服务器故障。
|
1月前
|
消息中间件 运维 Linux
运维最全Linux 命令大全之scp命令_linux scp 指令(1),2024年最新从消息中间件看分布式系统的多种套路
运维最全Linux 命令大全之scp命令_linux scp 指令(1),2024年最新从消息中间件看分布式系统的多种套路
|
1月前
|
运维 Linux Docker
ChatGLM3在Docker环境部署(1),Linux运维电话面试技巧
ChatGLM3在Docker环境部署(1),Linux运维电话面试技巧
|
1月前
|
运维 Linux Docker
ChatGLM3在Docker环境部署,Linux运维免打包多渠道统计如何实现
ChatGLM3在Docker环境部署,Linux运维免打包多渠道统计如何实现
|
1月前
|
运维 关系型数据库 MySQL
day03-Linux运维-Xshell优化和Linux系统命令入门(2)
day03-Linux运维-Xshell优化和Linux系统命令入门(2)
day03-Linux运维-Xshell优化和Linux系统命令入门(2)

热门文章

最新文章