我用 50 行 PowerShell 脚本,给 AI 代理装上了「自愈」能力
你让一个 AI 代理全天候运行,它迟早会出问题——进程崩溃、服务挂死、内存跑满。既然是「自主」代理,关键就是不用人一直盯着,所以你得让它自己能修自己。
于是「看门狗」模式就派上用场了:一个小脚本,时刻盯着关键进程,谁挂了就重启谁。简单到离谱,但这是我自从让 AI 代理 7×24 小时跑起来之后,做的最重要的一件事。
问题
我这台代理跑在一台 Windows 10 笔记本上——老 i5,8GB 内存。它要干的事不少:
- 自建的音乐流媒体服务器(Navidrome)
- 带 WebSocket 连接的 FastAPI 仪表板(Nexus)
- 壁纸自动切换引擎
- 系统实时状态监控
- AI 代理自身进程
任何一个挂掉都会引发连锁反应:
- 音乐服务器挂了 → 没音乐了,仪表板显示「服务器断开」
- 状态监控挂了 → 仪表板看不到实时数据
- 壁纸切换挂了 → 桌面就定格了
每次都得我本人发现,打开终端,手动重启。这哪还叫「自主」?
看门狗:50 行代码,30 秒轮询
下面就是真正的脚本。它是一个 PowerShell .ps1 文件,每 30 秒跑一次:
$processes = @(
@{ Name = "Navidrome" ; Path = "C:\navidrome\navidrome.exe" ; Args = "--server -p 4533" }
@{ Name = "Nexus" ; Path = "python" ; Args = "C:\hermes-workspace\project-nexus\server.py" }
@{ Name = "Wallpaper" ; Path = "powershell" ; Args = "-File C:\hermes-sandbox\scripts\anime-chaos-rotator.ps1" }
@{ Name = "LiveStats" ; Path = "powershell" ; Args = "-File C:\hermes-workspace\scripts\live-stats.ps1" }
)
while ( $true ) {
foreach ( $proc in $processes ) {
$running = Get-Process -Name $proc.Name -ErrorAction SilentlyContinue
if ( -not $running ) {
Write-Host "DIED: $( $proc.Name ) — restarting..."
Start-Process -FilePath $proc.Path -ArgumentList $proc.Args -WindowStyle Hidden
$log = "{0} | RESTARTED {1}" -f ( Get-Date -Format "yyyy-MM-dd HH:mm:ss" ), $proc.
添加自愈:看门狗的看门狗
Name Add-Content -Path "C:\hermes-workspace\logs\watchdog.jsonl" -Value $log } } Start-Sleep -Seconds 30 }
就是这样。没有Kubernetes,没有Docker,没有容器编排。只是普通的PowerShell,带一个while循环和Start-Process。
那么看门狗本身谁来监视?如果PowerShell进程自己崩溃了,一切就失去保护。修复方法是加一个守护者——一个每5分钟检查看门狗是否还活着的cron任务:
import subprocess, json
check = subprocess.run(['powershell.exe', '-Command', 'Get-Process watchdog -ErrorAction SilentlyContinue'],
capture_output=True, text=True)
if check.stdout.strip() == '':
subprocess.run(['powershell.exe', '-File', 'C:\\hermes-workspace\\scripts\\watchdog.ps1'])
print("WATCHDOG RESTARTED")
我通过代理框架把这个当作cron任务来运行(每5分钟,no_agent=true)。没有LLM token开销——它只是检查进程名的Python脚本。
运行两周后学到的经验
- 大多数崩溃是成批发生的。当内存使用率达到85%以上时,一切开始崩溃。有一次严重的内存泄漏,看门狗一天之内救了我12次:重启壁纸轮播器8次、状态监控器3次、Nexus 1次,全部在几秒内完成。
- JSONL日志是你的好帮手。每次重启都会在JSONL文件中写入一条带时间戳的记录。两周后我看到:
- 壁纸轮播器:47次重启(大多在内存密集型任务之后)
- 状态监控器:12次重启(大多在夜间)
- Nexus:3次重启(Python进程崩溃后)
- Navidrome:0次重启(非常稳定)
- 并非所有进程都应该无限重启。如果Nexus在一小时内崩溃10次,说明根本上有问题——持续重启会掩盖底层bug。我给每个进程加了每小时最多重启5次的限制。
- 启动顺序很重要。守护者先启动,然后启动看门狗,之后看门狗按依赖顺序启动其他所有东西。如果状态监控器和壁纸引擎都需要同一GPU资源,不要先启动状态监控器。
减去臃肿的技术栈
人们问我为什么不用Docker或systemd?
Windows 上没有 systemd(除非你开 WSL 这种额外开销),Docker Desktop 在我那台 8GB 笔记本上就要吃掉 2-4GB 内存,至于 Kubernetes,对一台 200 美元的笔记本来说简直就是个玩笑。而这个 50 行的 PowerShell 看门狗脚本只占 ~8MB 内存,0.3 秒启动,零外部依赖。在资源紧张的机器上,这点差别很关键。
你能用吗? 当然。把上面那个脚本拷下来,根据自己的服务改一下进程列表,直接跑就行。或者这样部署:
# 作为后台服务
powershell.exe -File watchdog.ps1
# 作为每5分钟执行的定时任务守护
python keeper.py
这套模式在任意 Windows 机器上都能跑。如果你在跑 agent、bot 或者其他需要保持存活的后台服务,这就是最便宜的保险。我从 2026 年起就在廉价硬件上跑自主 AI agent 了——没有赞助,不用 Kubernetes,就是一台 200 美元的笔记本、Python 和 PowerShell。