powershell脚本可实现windows服务实时监控,支持单服务轮询、多服务状态变化日志记录、异常自动重启及限频防抖,并提供后台运行与开机自启方案。
用 powershell 脚本可以轻松实现 windows 服务状态的实时监控,无需第三方工具,核心是定期查询服务状态并判断异常(如意外停止、启动失败),再通过日志记录或通知提醒运维人员。
基础监控:每秒检查指定服务是否运行
以下脚本持续检查 Spooler(打印后台处理程序)服务是否处于 Running 状态,每 5 秒检测一次,发现异常立即输出警告:
while ($true) {
$svc = Get-Service -Name Spooler -ErrorAction SilentlyContinue
if (-not $svc -or $svc.Status -ne 'Running') {
Write-Warning "服务 Spooler 异常:当前状态为 $($svc?.Status)"
# 可在此添加重启逻辑:Start-Service Spooler
}
Start-Sleep -Seconds 5
}
多服务批量监控 + 状态变化记录
监控多个关键服务(如 Dhcp、WinRM、W3SVC),只在状态发生变化时记录日志,避免刷屏:
$services = 'Dhcp', 'WinRM', 'W3SVC'
$stateCache = @{}
<p>while ($true) {
foreach ($name in $services) {
$svc = Get-Service -Name $name -ErrorAction SilentlyContinue
$current = $svc?.Status
$previous = $stateCache[$name]</p><pre class="brush:php;toolbar:false;"> if ($current -and $current -ne $previous) {
$time = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
"$time | $name : $previous → $current" | Out-File -FilePath .\svc-monitor.log -Append
$stateCache[$name] = $current
}
}
Start-Sleep -Seconds 10}
异常自动响应:停止后尝试重启 + 限频防抖
对高可用要求的服务,可在检测到停止后自动重启,并加入“5 分钟内最多重启 2 次”的防抖机制,防止反复崩溃导致雪崩:
- 用哈希表记录各服务最近重启时间与次数
- 每次触发重启前校验时间窗口和计数
- 重启失败时写入事件日志(便于 Windows 事件查看器追踪)
轻量级部署建议
- 保存为 monitor-services.ps1,右键“使用 PowerShell 运行”测试
- 转为后台任务:用 Start-Process powershell -ArgumentList "-File .\monitor-services.ps1" -WindowStyle Hidden
- 开机自启:将脚本封装为 Windows 服务(推荐使用 nssm.exe 工具包装 PowerShell 脚本)
- 如需邮件/企业微信通知,可在异常分支中调用 Send-MailMessage 或 Invoke-RestMethod 发送 Webhook











