1. 从凌晨三点的报警电话到自动化巡检的蜕变
凌晨三点,刺耳的电话铃声划破夜空。"运维吗?财务系统连不上了!"这样的紧急呼叫,相信每个Windows运维人员都不陌生。匆忙打开电脑,远程登录服务器,发现SQL Server服务不知何时已经停止。手动启动服务、等待系统恢复、翻查日志寻找原因...这一套流程下来,天都亮了。
这种场景在我的职业生涯中反复上演。每天到岗第一件事就是逐台服务器检查服务状态,生怕哪台机器掉链子。遇到服务异常停止,还要手动重启、观察、写报告,这些重复性劳动占据了大量工作时间。直到有一天我意识到:运维的价值不在于拼体力,而在于拼自动化。
经过两周的开发和测试,我成功编写了一套PowerShell服务巡检与自愈脚本。这套脚本彻底改变了我的工作模式:从每天2小时的手动检查,到现在只需5分钟查看日报;从半夜被紧急电话叫醒,到现在异常自动修复并记录。今天,我将完整分享这套脚本的实现思路和使用方法,希望能帮助更多运维同仁从重复劳动中解放出来。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 脚本核心功能设计解析
2.1 需求分析与功能定位
在设计这套自动化巡检脚本前,我首先梳理了日常运维中的痛点:
- 多台服务器上的多个关键服务需要定期检查
- 服务异常停止时需要及时重启
- 需要清晰记录服务状态变化
- 异常情况需要明确标识以便后续处理
基于这些需求,脚本需要实现以下核心功能:
- 批量检查:支持一次检查多台服务器上的多个关键服务状态
- 自动修复:发现服务停止时,自动尝试重启服务
- 状态反馈:实时输出服务状态,重启成功或失败一目了然
- 异常记录:汇总所有异常服务,生成清晰报表
- 日志留存:自动记录每次巡检日志,方便问题追溯
2.2 技术选型与实现思路
选择PowerShell作为实现语言主要基于以下考虑:
- 原生支持Windows服务管理(Get-Service/Start-Service等cmdlet)
- 内置远程执行能力(Invoke-Command)
- 强大的日志记录功能(Start-Transcript)
- 完善的异常处理机制(try-catch)
- 灵活的报表生成能力(PSCustomObject)
脚本采用模块化设计,主要包含以下组件:
- 参数定义模块:处理命令行参数和默认值
- 配置管理模块:读取服务器和服务列表配置
- 凭据管理模块:安全存储和加载管理员凭据
- 巡检执行模块:实际执行服务检查和重启操作
- 报表生成模块:汇总并输出检查结果
- 日志记录模块:记录完整执行过程
3. 脚本实现细节与关键技术
3.1 配置文件设计与解析
脚本支持两种配置方式:内置默认列表和外部CSV配置文件。外部配置文件采用以下格式:
csv复制Server,Service
mppd1,Spooler,MSSQLSERVER
mppd2,Spooler,SQLBrowser
配置文件解析逻辑考虑了以下细节:
- 自动跳过空行和无效行
- 支持服务名中包含特殊字符
- 服务器去重处理
- 完善的错误检查机制
powershell复制$rawLines = Get-Content $ConfigPath | Where-Object { $_ -notmatch '^\s*$' }
$headers = ($rawLines[0] -split ',').Trim()
if ($headers[0] -ne 'Server' -or $headers[1] -ne 'Service') {
Write-Host "配置文件格式错误" -ForegroundColor Red
exit
}
$serviceMap = @{}
$servers = @()
for ($i = 1; $i -lt $rawLines.Count; $i++) {
$fields = $rawLines[$i] -split ','
$serverName = $fields[0].Trim()
$serviceNames = $fields[1..($fields.Count-1)] | ForEach-Object { $_.Trim() }
$servers += $serverName
$serviceMap[$serverName] =
