Windows脚本:监控自动并重启某个进程
在实际应用中,我们会发现有些程序(进程)在运行的时候可能会挂掉或电脑关机重启了某些进程没有自动启动,需要我们去监控该程序,并在它挂掉的时候迅速重启,确保该程序能一直运行。比如redis应用服务就经常挂,需要监控程序去监控。
Linux系统有守护进程的概念,Windows系统可以使用dos批处理实现监控并重启某个进程
,下面将介绍通过批处理实现监控并重启某个进程的全过程。
一、简介
下面以redis服务进程redis-server.exe
为例,实现监控并重启该进程的全过程。
该进程的信息如下:
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、对应的应用服务的安装目录
使用bat脚本进行监听,在运行Batch(BAT)脚本时,通常会弹出一个命令行窗口来显示脚本的执行,一旦关闭这个窗口,会导致服务停止。这不利于长时间持续的服务监听,因为我们实际工作过程中很容易随手关闭cmd窗口。当然也有方法解决这个问题。
2.2 创建并运行脚本
在Windows上创建并运行脚本,需要根据脚本类型进行操作。最常见的脚本类型有批处理文件(.bat或.cmd)和PowerShell脚本。这里我以批处理bat文件为例:
- 创建文件(名称可自定义,后缀以
.bat
或.cmd
),这里我的文件名称为:pm_redis.bat
- 通过记事本打开文件,将上述代码复制到文件中,并保存,如上图所示。
- 双击运行
pm_redis.bat
脚本文件。此时会发现redis服务会自动启动,并且会定时检测。
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脚本方式来实现应用程序的监听。如下示例:
三、使用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
请注意:
- 将
SERVICE_NAME
变量设置为你要监视的服务的名称。 - 将
PROGRAM_PATH
变量设置为你要监视的服务的安装运行路径。 可以根据需要调整等待时间和检查频率
- 将此脚本保存为
.vbs
文件
3.2 运行脚本
通过双击或在命令行中运行cscript yourscript.vbs
来执行它。脚本将进入无限循环,检查服务状态,并在服务停止时重新启动它。
如果允许时弹框提示报错,且错误信息是
800A0408
,通常表示在编程或脚本执行过程中遇到了无效的字符。这个错误可能由多种原因引起,如文本编码、特殊字符的使用等。为了解决这个问题,可以尝试以下方法:
- 检查脚本编码:在VB中通常使用
ANSI
编码。可以使用文本编辑器(如记事本)打开脚本,然后另存为ANSI
编码的文件。- 检查特殊字符:检查脚本中是否使用了无效或特殊的字符。
- 使用正确的语法和字符:例如在VB中,字符串应该用双引号(“”)括起来,而不是单引号(')
四、设置脚本开机自启动
如果需要开机时脚本文件自动启动,将脚本文件移动到启动文件夹中(.bat或.vbs文件)。
在Windows系统中,可以通过多种方法设置应用程序开机自启动,其中一种常见的方法是将应用程序放到启动文件夹中。有两种方式,一种是针对所有用户生效,另一种是只对某个用户生效。操作步骤如下:
- 所有用户启动都会自动启动:将脚本文件复制到
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
文件夹中 - 指定登录用户启动时会自动启动:打开启动文件夹(本用户的),win+R打开运行窗口,输入:
shell:startup
将对应脚本拖到启动文件夹中。 - 将电脑关机,测试会不会自动重启。
五、某些软件加入启动项后,开机不会自动启动的解决方法
- 问题:脚本加入启动项后,开机没有自动启动
- 原因分析:win10系统,只要是图标右下角带盾牌标志的软件,加入系统的启动文件夹:如:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 里面,每次开机后都会启动失败!据说这个是win10出于系统安全考虑,加入了UAC,对系统管理员权限做了限制造成的。
- 解决方案:
- win+R打开运行窗口,运行打开组策略(家庭版没有组策略功能),输入:
gpedit.msc
- 依次展开:计算机配置-》Windows设置-》安全设置-》本地策略-》安全选项-》用户账户控制:以管理员批准模式运行所有管理员,设置为
已禁用
- 重启计算机