我用 50 行 PowerShell 脚本,给 AI 代理装上了「自愈」能力

Dev.to AI 2026-07-20T23:34:00.339735

你让一个 AI 代理全天候运行,它迟早会出问题——进程崩溃、服务挂死、内存跑满。既然是「自主」代理,关键就是不用人一直盯着,所以你得让它自己能修自己。
于是「看门狗」模式就派上用场了:一个小脚本,时刻盯着关键进程,谁挂了就重启谁。简单到离谱,但这是我自从让 AI 代理 7×24 小时跑起来之后,做的最重要的一件事。

问题

我这台代理跑在一台 Windows 10 笔记本上——老 i5,8GB 内存。它要干的事不少:

任何一个挂掉都会引发连锁反应:

每次都得我本人发现,打开终端,手动重启。这哪还叫「自主」?

看门狗: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脚本。

运行两周后学到的经验

  1. 大多数崩溃是成批发生的。当内存使用率达到85%以上时,一切开始崩溃。有一次严重的内存泄漏,看门狗一天之内救了我12次:重启壁纸轮播器8次、状态监控器3次、Nexus 1次,全部在几秒内完成。
  2. JSONL日志是你的好帮手。每次重启都会在JSONL文件中写入一条带时间戳的记录。两周后我看到:
  3. 壁纸轮播器:47次重启(大多在内存密集型任务之后)
  4. 状态监控器:12次重启(大多在夜间)
  5. Nexus:3次重启(Python进程崩溃后)
  6. Navidrome:0次重启(非常稳定)
  7. 并非所有进程都应该无限重启。如果Nexus在一小时内崩溃10次,说明根本上有问题——持续重启会掩盖底层bug。我给每个进程加了每小时最多重启5次的限制。
  8. 启动顺序很重要。守护者先启动,然后启动看门狗,之后看门狗按依赖顺序启动其他所有东西。如果状态监控器和壁纸引擎都需要同一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。

我用 50 行 PowerShell 脚本写了个会自愈的 AI 代理

查看原文