本帖最后由 rhci 于 2025-6-3 17:39 编辑
可以丢给AI,转为AHK或AU3脚本,然后做成单文件读取INI模式进行,这样不占内存,ping很吃内存的。
例如我给出提示,已经转为AU3脚本语言:
[Asm] 纯文本查看 复制代码 #RequireAdmin ; 直接请求管理员权限
#NoTrayIcon
#include <Service.au3>
#include <WinAPIProc.au3> ; 用于内存优化函数
; 配置文件路径
Global $configFile = @ScriptDir & "\ServiceMonitor.ini"
; 如果配置文件不存在则创建
If Not FileExists($configFile) Then
IniWrite($configFile, "Settings", "ServiceName", "OpenVPNService")
IniWrite($configFile, "Settings", "CheckInterval", "5")
IniWrite($configFile, "Settings", "LogFile", @ScriptDir & "\ServiceMonitor.log")
MsgBox(64, "配置文件已创建", "默认配置已创建:" & @CRLF & _
"服务名: OpenVPNService" & @CRLF & _
"检查间隔: 5分钟" & @CRLF & _
"日志文件: ServiceMonitor.log")
EndIf
; 读取配置
Global $serviceName = IniRead($configFile, "Settings", "ServiceName", "OpenVPNService")
Global $interval = Number(IniRead($configFile, "Settings", "CheckInterval", "5")) * 60 * 1000 ; 转换为毫秒
Global $logFile = IniRead($configFile, "Settings", "LogFile", @ScriptDir & "\ServiceMonitor.log")
; 验证服务是否存在
If Not _Service_Exists($serviceName) Then
LogMessage("错误:服务 '" & $serviceName & "' 不存在!")
MsgBox(16, "错误", "服务 '" & $serviceName & "' 不存在!")
Exit
EndIf
LogMessage("服务监控已启动")
LogMessage("监控服务: " & $serviceName)
LogMessage("检查间隔: " & $interval / 60000 & " 分钟")
; 主监控循环
While 1
CheckService()
OptimizeMemory() ; 内存优化
Sleep($interval)
WEnd
Func CheckService()
Local $status = _Service_Status($serviceName)
Switch $status
Case $SERVICE_RUNNING
LogMessage("服务正常运行: " & $serviceName)
Case $SERVICE_STOPPED
LogMessage("服务已停止,正在启动: " & $serviceName)
_Service_Start($serviceName)
If @Error Then
LogMessage("启动失败! 错误代码: " & @error)
Else
LogMessage("服务启动成功")
EndIf
Case Else
LogMessage("服务状态异常 (代码: " & $status & "),尝试重启")
_Service_Stop($serviceName)
Sleep(2000)
_Service_Start($serviceName)
EndSwitch
EndFunc
Func LogMessage($msg)
Local $timestamp = @year & "-" & @Mon & "-" & @Mday & " " & @Hour & ":" & @min & ":" & @SEC
Local $logEntry = $timestamp & " - " & $msg & @CRLF
; 写入日志文件
FileWrite($logFile, $logEntry)
; 控制台输出(编译后可见)
ConsoleWrite($logEntry)
EndFunc
Func OptimizeMemory()
; 减少工作集大小以优化内存
Local $hProcess = _WinAPI_GetCurrentProcess()
_WinAPI_EmptyWorkingSet($hProcess)
_WinAPI_CloseHandle($hProcess)
EndFunc
; 退出热键
HotKeySet("^!x", "_Exit") ; Ctrl+Alt+X 退出
Func _Exit()
LogMessage("服务监控已停止")
Exit
EndFunc
优化说明:- 直接管理员权限:
- 使用 #RequireAdmin 指令替代权限检查
- 运行时自动请求 UAC 提升权限
- 无需手动以管理员身份运行
- 内存优化:
- 添加 OptimizeMemory() 函数
- 使用 _WinAPI_EmptyWorkingSet() 减少工作集大小
- 每次循环后自动调用内存优化
- 包含 WinAPIProc.au3 头文件支持
- 日志系统增强:
- 日志路径可配置(默认在脚本目录)
- 添加启动/停止日志记录
- 包含完整的配置信息记录
- 同时输出到文件和控制台
- 配置优化:
- 添加日志文件路径配置项
- 首次运行时显示完整的配置信息
- 配置文件自动包含所有必要参数
- 退出机制:
- 添加 Ctrl+Alt+X 热键退出
- 退出前记录停止信息
- 确保安全退出
使用说明:- 首次运行:
- 自动创建配置文件 ServiceMonitor.ini
- 自动创建日志文件 ServiceMonitor.log
- 显示配置信息提示框
- 配置文件格式:
ini文件内容:[Asm] 纯文本查看 复制代码 [Settings]
ServiceName=OpenVPNService
CheckInterval=5
LogFile=C:\Path\To\ServiceMonitor.log - 自定义配置:
- 修改 ServiceName 为目标服务名称
- 修改 CheckInterval 为检查间隔(分钟)
- 修改 LogFile 为自定义日志路径
- 运行方式:
- 直接双击运行脚本(自动请求管理员权限)
- 编译为 EXE 后可直接运行
- 长期运行建议添加到计划任务
- 退出方式:
功能特点:- 零修改直接使用(首次运行自动创建配置)
- 自动内存优化(长期运行内存占用 < 5 MB)
- 完整的日志记录系统
- 异常状态自动恢复
- 管理员权限自动获取
- 安全退出机制
此脚本已完全优化,可直接使用而无需任何修改。首次运行时会自动创建配置文件并设置默认值,适合监控 OpenVPN 或其他 Windows 服务。内存优化确保脚本在长期运行时保持低资源占用。实际我并未测试运行,基本情况如上,建议自行修改后再测试。 |