Windows脚本:监控并自动重启某个进程

本文介绍了如何在Windows系统中使用批处理(.bat)和VBScript脚本来监控并自动重启进程,包括脚本的编写、运行、设置关闭cmd窗口以及开机自启动。特别提到win10系统的UAC限制问题及其解决方案。
摘要由CSDN通过智能技术生成


  在实际应用中,我们会发现有些程序(进程)在运行的时候可能会挂掉或电脑关机重启了某些进程没有自动启动,需要我们去监控该程序,并在它挂掉的时候迅速重启,确保该程序能一直运行。比如redis应用服务就经常挂,需要监控程序去监控。
  Linux系统有守护进程的概念,Windows系统可以使用dos批处理实现监控并重启某个进程,下面将介绍通过批处理实现监控并重启某个进程的全过程。

回到目录

一、简介

  下面以redis服务进程redis-server.exe 为例,实现监控并重启该进程的全过程。
1

该进程的信息如下:
1、进程名称: redis-server.exe
2、进程安装目录:D:\work\redis

  要在Windows上实现应用程序的监控,一旦服务停止,立即重新启动有多种方式。目前常用的方式有使用批处理(.bat)、命令提示符(cmd)和VBScript。各有其优缺点,用户根据实际情况自己选择:

  • 批处理(.bat)优点
    • 简单易用:批处理文件是纯文本文件,可以很容易地编写和修改。
    • 执行速度快:批处理文件是直接由命令行解释器执行的,因此执行速度较快
    • 资源占用少:批处理文件占用较少的系统资源。
  • 批处理(.bat)的缺点
    • 功能有限:批处理脚本的功能相对简单,无法实现复杂的逻辑或操作。
    • 错误处理较弱:批处理脚本没有内置的错误处理机制,需要手动编写错误检查和处理代码。
    • 可维护性低:批处理脚本的代码结构简单,难以维护和扩展。
  • 命令提示符(cmd)的优点
    • 功能强大:命令提示符提供了丰富的命令和工具,可以实现各种系统管理和操作
    • 灵活性高:命令提示符支持用户自定义命令和脚本,可以快速执行复杂的操作。
    • 集成度高:命令提示符是Windows系统的标准组件之一,与系统紧密集成。
  • 命令提示符(cmd)的缺点
    • 命令行界面:命令提示符是一个命令行界面,需要用户具备一定的命令行操作经验。
    • 安全性问题:由于命令提示符具有很高的权限,如果用户输入错误的命令或执行恶意脚本,可能会导致系统安全问题。
    • 资源占用较高:相对于批处理文件,命令提示符可能会占用更多的系统资源。
  • VBScript的优点
    • 功能强大:VBScript是一种完整的脚本语言,具有丰富的内置函数和对象模型,可以实现更复杂的逻辑和操作。
    • 易于维护:VBScript支持结构化的编程风格,代码易于阅读和维护。
    • 错误处理:VBScript支持异常处理,可以更好地处理错误和异常情况。
    • 集成度高:VBScript与Windows系统紧密集成,可以利用Windows提供的各种组件和功能。
  • VBScript的缺点:
    • 执行速度较慢:相对于批处理文件和命令提示符,VBScript脚本需要由解释器解释执行,因此执行速度较慢
    • 需要安装解释器:在某些情况下,用户可能需要安装额外的软件或组件才能运行VBScript脚本
    • 安全性问题:由于VBScript脚本是解释执行的,因此可能存在安全风险,需要注意脚本的安全性。

在实际使用中,我们常用的是.bat和VBScript。下面将分别介绍如何使用.bat和VBScript编制redis应用程序线程监护脚本文件。在系统支持的情况下,建议使用VBScript脚本方式来实现应用程序的监听,更方便灵活

回到目录

二 .bat脚本方式

2.1 编制脚本

示例程序如下:

@echo off  
setlocal enabledelayedexpansion  
  
:RESTART  
tasklist /FI "IMAGENAME eq redis-server.exe" | find /C "redis-server.exe" > temp.txt  
set /p num=<temp.txt  
del /F temp.txt  
echo %num%  
if "%num%"=="0" (  
    start "" /D "D:\work\redis" redis-server.exe  
)  
ping -n 10 -w 2000 0.0.0.1 > nul  
goto RESTART

代码说明:

  • tasklist:是列出所有进程,可以指定只列出某用户的进程,用/FI参数过滤。
  • find /C:可以去tasklist的结果中查找指定进程名,并输出个数。
  • ping命令:使用ping命令自带的延迟参数-w,将IP地址设置成一个空地址,设置每隔一段时间去检测进程是否在运行。比如0.0.0.1,这样该命令会一直ping,直到一定n*w 毫秒后才返回(n和w分别是参数-n和-w指定的值)。
  • goto语句:将监控程序设置成死循环。
  • start /D path program:异步调用program程序, 即不等program指定完毕就执行下面的语句,因此可以设置固定间隔(n*w毫秒)去监测。

要是监控其他进程,如下所示图中标出部分都需要修改成实际需求的应用程序信息:

其中:

  • 1、2、4对应的是应用程序名称,对应任务管理器中的进程名称
  • 3、对应的应用服务的安装目录
    1
    使用bat脚本进行监听,在运行Batch(BAT)脚本时,通常会弹出一个命令行窗口来显示脚本的执行,一旦关闭这个窗口,会导致服务停止。这不利于长时间持续的服务监听,因为我们实际工作过程中很容易随手关闭cmd窗口。当然也有方法解决这个问题。

回到目录

2.2 创建并运行脚本

  在Windows上创建并运行脚本,需要根据脚本类型进行操作。最常见的脚本类型有批处理文件(.bat或.cmd)和PowerShell脚本。这里我以批处理bat文件为例:

  1. 创建文件(名称可自定义,后缀以.bat.cmd),这里我的文件名称为:pm_redis.bat
  2. 通过记事本打开文件,将上述代码复制到文件中,并保存,如上图所示。
  3. 双击运行pm_redis.bat脚本文件。此时会发现redis服务会自动启动,并且会定时检测。
    1

回到目录

2.3 设置关闭cmd窗口

  在运行Batch(BAT)脚本时,通常会弹出一个命令行窗口来显示脚本的执行。如果你想在运行BAT脚本时关闭命令行窗口,有几种方法可以实现这个目的:

  • 使用VBScript:
    • 创建一个新的VBScript(.vbs)文件,然后在该文件中使用以下代码来运行你的BAT脚本:
CreateObject("Wscript.Shell").Run "your_script.bat", 0, True

将 “your_script.bat” 替换为你的BAT脚本的路径。双击该VBScript文件,它将在不显示命令行窗口的情况下运行你的BAT脚本。

  • 使用任务计划程序:
    • 使用Windows的任务计划程序创建一个新任务,该任务将运行你的BAT脚本。在任务的属性中,你可以选择“不管用户是否登录都要运行”,并取消勾选“运行时显示新窗口”选项。然后,你可以运行该任务,它将在没有命令行窗口的情况下执行你的BAT脚本。
  • 使用第三方工具:
    • 有一些第三方工具和实用程序,如hstart或Hidden Start,可以在没有命令行窗口的情况下运行BAT脚本。
  • 编译为可执行文件(EXE):
    • 可以使用如Bat To Exe Converter这样的工具将你的BAT脚本转换为可执行文件(EXE),并选择在没有窗口的情况下运行它。

这里我选用的是第一种方法,使用VBScript,到这里还是需要使用VBScript来进行再调用,比较麻烦。所以在系统支持的情况下,建议使用VBScript脚本方式来实现应用程序的监听。如下示例:
1

回到目录

三、使用VBScript脚本方式

3.1 编制脚本

  以下是一个示例脚本,它可以监视一个特定的服务(如redis),并在服务停止时重新启动它。创建一个文件后缀名为.vbs,文件内容如下:

' 定义服务名称  
Const SERVICE_NAME = "redis-server.exe"  
  
' 定义程序的运行路径  
Const PROGRAM_PATH = "D:\work\redis\redis-server.exe"  
  
' 定义一个函数来检查服务状态  
Function IsServiceRunning(serviceName)  
    Dim objService, objWMIService, colServices, service  
    Set objWMIService = GetObject("winmgmts:\\localhost\root\cimv2")  
    Set colServices = objWMIService.ExecQuery("SELECT * FROM Win32_Service WHERE Name='" & serviceName & "'")  
    For Each service In colServices  
        If service.State <> "Stopped" Then  
            IsServiceRunning = True  
            Exit Function  
        End If  
    Next  
    IsServiceRunning = False  
End Function  
  
' 主程序开始  
Do While True  
    If Not IsServiceRunning(SERVICE_NAME) Then  
        ' 服务停止,尝试重新启动服务  
        Dim objShell  
        Set objShell = CreateObject("WScript.Shell")  
        objShell.Run PROGRAM_PATH, 0, True  
        ' 等待一段时间再次检查服务状态,避免立即失败  
        WScript.Sleep 10000 ' 10秒  
    Else  
        ' 服务正在运行,等待一段时间后再次检查  
        WScript.Sleep 5000 ' 5秒  
    End If  
Loop

1

请注意

  • SERVICE_NAME变量设置为你要监视的服务的名称。
  • PROGRAM_PATH变量设置为你要监视的服务的安装运行路径。
  • 可以根据需要调整等待时间和检查频率
  • 将此脚本保存为.vbs文件

回到目录

3.2 运行脚本

   通过双击或在命令行中运行cscript yourscript.vbs来执行它。脚本将进入无限循环,检查服务状态,并在服务停止时重新启动它。

如果允许时弹框提示报错,且错误信息是800A0408,通常表示在编程或脚本执行过程中遇到了无效的字符。这个错误可能由多种原因引起,如文本编码、特殊字符的使用等。为了解决这个问题,可以尝试以下方法:

  1. 检查脚本编码:在VB中通常使用ANSI编码。可以使用文本编辑器(如记事本)打开脚本,然后另存为ANSI编码的文件。
  2. 检查特殊字符:检查脚本中是否使用了无效或特殊的字符。
  3. 使用正确的语法和字符:例如在VB中,字符串应该用双引号(“”)括起来,而不是单引号(')

回到目录

四、设置脚本开机自启动

  如果需要开机时脚本文件自动启动,将脚本文件移动到启动文件夹中(.bat或.vbs文件)。
  在Windows系统中,可以通过多种方法设置应用程序开机自启动,其中一种常见的方法是将应用程序放到启动文件夹中。有两种方式,一种是针对所有用户生效,另一种是只对某个用户生效。操作步骤如下:

  1. 所有用户启动都会自动启动:将脚本文件复制到 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup 文件夹中
  2. 指定登录用户启动时会自动启动:打开启动文件夹(本用户的),win+R打开运行窗口,输入:shell:startup
    1
    将对应脚本拖到启动文件夹中。
  3. 将电脑关机,测试会不会自动重启。

回到目录

五、某些软件加入启动项后,开机不会自动启动的解决方法

  • 问题:脚本加入启动项后,开机没有自动启动
  • 原因分析:win10系统,只要是图标右下角带盾牌标志的软件,加入系统的启动文件夹:如:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 里面,每次开机后都会启动失败!据说这个是win10出于系统安全考虑,加入了UAC,对系统管理员权限做了限制造成的。
  • 解决方案
  1. win+R打开运行窗口,运行打开组策略(家庭版没有组策略功能),输入:gpedit.msc
    1
  2. 依次展开:计算机配置-》Windows设置-》安全设置-》本地策略-》安全选项-》用户账户控制:以管理员批准模式运行所有管理员,设置为已禁用
    1
    2
    3
  3. 重启计算机

回到目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值