AI Agent 远程运维卡住怎么办?排查迭代预算耗尽问题
用 AI Agent 做远程服务器运维很方便,但有个头疼的问题:干到一半它卡住了,然后一直重复"我已经总结了前面的工作,请继续告诉我下一步",怎么推都没用。
查了一晚上日志,终于找到根因。记录一下排查过程和解决方案。
现象
Agent 在执行远程服务器操作时,日志反复出现:
⚠️ Reached maximum iterations (60). Requesting summary...
iteration budget exhausted (60/60)然后 Agent 总结一下前面做了什么,停下来等你回复。你发"继续",它又执行几下,然后又卡住。一个简单的 SSH + sudo 操作能循环好几个小时。
根因分析
问题分三层。
第一层:迭代预算不够
Agent 每轮对话最多调用 60 次工具。听起来不少,但实际远程运维中消耗很快:
- 每次
sshpass ssh连接服务器 = 1 次工具调用 - 执行 sudo 命令 = 如果 sudo 弹交互提示,再重试 = 2-3 次
execute_code里套terminal()调用 = 嵌套引号容易写错,每次语法错误浪费 3-5 次- 修改 skill 和 memory 的错误重试 = 2-3 次
60 次看起来多,实际上一轮复杂操作几下就用完了。
第二层:sudo 交互提示阻塞
在 SSH 远程执行命令时,如果遇到 sudo 需要密码,在不带 PTY 的模式下会静默失败或返回空结果。Agent 不知道发生了什么,会尝试换种方式重新执行,又消耗几次调用——然后又失败,形成死循环。
sudo: a terminal is required to read the password第三层:execute_code 嵌套引号问题
在一个 execute_code 调用内部再调用 terminal(),并用 f-string 拼接远程命令,引号嵌套非常容易出错:
r = terminal(f"sshpass -p 'pw' ssh host 'echo {some_var}'")如果 some_var 包含特殊字符,整个命令就炸了。更隐蔽的是多层嵌套:
r1 = terminal(f"sshpass -p 'pw' ssh host 'bash -c \"echo {data}\"'")每一层引号都要小心转义,写错一步就是 SyntaxError,白白浪费一次 API 调用。
解决方案
1. 提高迭代预算
hermes config set agent.max_turns 120
hermes config set agent.delegation.max_iterations 100从 60 提高到 120(子代理从 50 提高到 100),给复杂任务留出足够的工具调用空间。
2. 配置 SUDO_PASSWORD
把 sudo 密码加入到环境配置中,避免交互式密码提示阻塞:
SUDO_PASSWORD=your_sudo_passwordAgent 在需要 sudo 时会自动注入密码,不会中途卡住。
3. 合并 SSH 命令
把多次分开的 SSH 调用合并成一个脚本,上传到远程服务器的 /tmp/ 再执行:
# 错误做法:6 次 SSH 调用
ssh host 'cmd1'
ssh host 'cmd2'
ssh host 'cmd3'
# 正确做法:1 次调用
cat > /tmp/fix.sh << 'SCRIPT'
cmd1 && cmd2 && cmd3
SCRIPT
ssh host 'bash /tmp/fix.sh'这样从 6 次工具调用减到 2 次(上传 + 执行)。
4. 用子代理处理复杂远程操作
对于复杂的远程服务器操作,使用 delegate_task 在子代理中执行。子代理有自己的迭代预算,不会消耗主会话的调用次数。
5. 避免 execute_code 嵌套 terminal()
复杂 shell 操作不要写在 execute_code 里面套 terminal()。改用两段式:先用 write_file 写好独立脚本,再用 terminal 执行。
优化效果
修复后,同一台服务器的完整优化流程(OPcache 配置、Nginx 安全头、MySQL 绑定、Cookie 安全等 8 项操作)一次性完成,没有中断,耗时约 5 分钟。
总结
用 AI Agent 做运维时,"卡住"不一定是 AI 能力问题,往往是配置层面的限制。合理的迭代预算、避免 sudo 交互、合并命令、减少嵌套——这些工程层面的优化比提升模型能力更有用。