通过定时轮询自动化长时间运行的异步任务的最佳实践。适用于监控后台 CLI 命令或 API 调...
投票最佳做法
功能概述
投票最佳做法是一项面向实际任务的技能,主要用于一种指导式技能,用于使长期运行自动化, 使用与计算兼容的投票模式同步完成;当任务无法同步完成时( 例如, CLI c)。
核心要点
- 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
- 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
- 该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。
使用与执行
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
结果检查与注意事项
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
轮询最佳实践
一种以指导风格设计的技能,用于通过 兼容 cron 的轮询模式 自动化长期运行、异步执行的任务。当某项任务无法同步完成时(例如:一个触发后台作业并返回作业 ID 的 CLI 命令),该技能将引导智能体完成以下步骤:(1) 判断轮询是否适用;(2) 与用户进行一次性预检确认;(3) 创建任务专属目录;(4) 编写轮询脚本;(5) 启动后台作业;(6) 持续监控直至完成或超时。
语言要求:所有面向用户的确认信息均须使用用户当前会话所用语言(请检查会话语言 — 若用户使用中文交流,则以中文回复;若为英文,则以英文回复)。
1. 适用性核查清单
开始前,智能体必须回答以下问题:
✅ 适用于轮询 — 当且满足以下全部条件时:
- 目标命令/API 能 立即返回 一个 进程 ID、作业 ID、产物 ID 或类似句柄
- 存在 明确、可被机器解析的完成判定条件(例如:JSON/TOML 中的某个字段、状态字符串、退出码、某个文件的出现)
- 该条件可通过 重复执行同一命令 或调用一个轻量级查询命令来验证
- 等待时间 可预期(通常为 1–15 分钟)
- 执行过程中 无需实时用户交互
❌ 不适用于轮询 — 当满足以下任一条件时:
- 任务完成与否需依赖 复杂的 LLM 判断(例如:“该输出是否已足够好?”)
- 任务需向用户 实时流式输出或展示输出内容
- 任务结果在轮询过程中会因中间状态而 动态变化
- 完成判定条件 模糊或主观
- 用户希望在执行中途 中止或重定向任务
若任务不适用于轮询,请告知用户,并建议替代方案(例如:同步执行、仅对最终等待阶段使用子智能体配合轮询等)。
2. 预检确认(一次性确认全部参数)
启动任何轮询任务前,必须以单条消息向用户确认全部参数。此举可避免来回沟通,并明确各方预期。
确认信息须使用用户当前会话语言。
示例(英文):
Before starting, please confirm the following: ① Polling target - Task: [brief description] - Command to check status: [exact command] - Expected completion condition: [e.g., output contains "status: completed"] ② Poll interval: every [X] minutes (default: 5 minutes) ③ Max duration: up to [Y] polls = [Z] minutes max (default: 40 min / 8 polls) ④ On completion: [download file / run command / send message / do nothing] ⑤ On failure/timeout: [notify me / stay silent] ⑥ Output directory: [path] (default: ~/Downloads or relevant workspace folder) ⑦ Temp folder retention: keep for review after completion? [yes / no] Reply with any changes, or "ok" to proceed with defaults.
示例(中文 — 结构相同,内容翻译):
启动前请确认以下参数: ① 轮询对象 - 任务:[简短描述] - 状态查询命令:[具体命令] - 成功判定条件:[例如输出包含 "status": "completed"] ② 轮询频率:每 [X] 分钟一次(默认:5 分钟) ③ 最长持续时间:最多 [Y] 次轮询 = [Z] 分钟(默认:40 分钟 / 8 次) ④ 完成后动作:[下载文件 / 运行命令 / 发消息 / 不做处理] ⑤ 失败/超时时:[通知我 / 不通知] ⑥ 产物保存位置:[路径](默认:~/Downloads 或相关工作目录) ⑦ 临时文件夹保留:完成后保留供复查?[是 / 否] 直接回复修改项,或"确认"以默认参数启动。
未获用户确认前,不得启动轮询。 若用户在合理时间内未响应,请仅跟进一次。
3. 临时目录结构
每个轮询任务均拥有独立的临时目录。这使任务具备自包含性、可恢复性,也便于后续检查或清理。
/tmp// ← category:例如 notebooklm、deep-research、generic _ / ← 按时间戳命名的单任务目录 task.json ← 任务元数据及全部参数 progress.json ← 当前轮询状态(轮询次数、上次检查时间、各类句柄) poll.log ← 每次轮询尝试的日志(时间戳 + 结果) error.log ← 遇到的错误 done.flag ← 空文件,任务成功完成后创建
命名规则:
- 分类目录名:小写、使用连字符分隔、能准确描述任务类型(例如:
notebooklm-audio、deep-research、generic-async) - 任务子目录名:
YYMMDD-HHmm+_+ 清洗后的任务名(空格→连字符,最长 40 字符,剔除特殊字符)
若分类目录尚不存在,则创建之;若任务子目录已存在(例如此前已有尝试),则询问用户:“继续之前任务,还是重新开始?”
task.json 格式定义
{
"category": "notebooklm-audio",
"task_name": "example-notebook-audio",
"poll_command": "nlm studio status ",
"parse_rule": {
"type": "json",
"path": ".[0].status",
"success_value": "completed",
"failure_value": "failed"
},
"on_complete_command": "nlm download audio --id -o ",
"verify_output": true,
"poll_interval_seconds": 300,
"max_polls": 8,
"timeout_action": "notify",
"failure_action": "notify",
"output_path": "/path/to/output.m4a",
"temp_dir": "/tmp/notebooklm-audio/260325-1400_example-audio",
"created_at": "2026-03-25T22:00:00Z",
"user_confirmed": true
}
progress.json 格式定义
{
"poll_count": 3,
"last_poll_at": "2026-03-25T22:15:00Z",
"last_poll_result": "in_progress",
"artifact_id": "abc123...",
"current_handle": "..."
}
4. 编写轮询脚本
将脚本写入任务临时目录()。脚本必须 完全自包含 —— 除标准 Unix 工具外,不得依赖任何外部组件。
必需特性:
- 脚本开头必须包含
set -euo pipefail - 启动时须检查
done.flag—— 若已存在,则立即以 0 退出(任务已完成) - 发生任何错误(如认证过期、命令失败、超时)时,须记录至
error.log并在退出前保存当前进度 - 每次轮询尝试后均须更新
progress.json - 每次轮询结果均须追加至
poll.log(含时间戳 + 截断后的输出) - 禁止删除临时目录 —— 清理时机由用户决定
脚本模板(最小可用版):
#!/bin/bash
set -euo pipefail
TASK_DIR="/tmp/category/YYMMDD-HHmm_taskname"
cd "$TASK_DIR"
# Check if already done
[[ -f done.flag ]] && echo "Already complete." && exit 0
# Load progress
POLL_COUNT=$(grep '"poll_count"' progress.json 2>/dev/null | sed 's/[^0-9]//g') || POLL_COUNT=0
MAX_POLLS=8
INTERVAL=300
while true; do
POLL_COUNT=$((POLL_COUNT + 1))
if [[ $POLL_COUNT -gt $MAX_POLLS ]]; then
echo "[$(date)] TIMEOUT after $MAX_POLLS polls" >> error.log
exit 1
fi
echo "[$(date)] Poll $POLL_COUNT/$MAX_POLLS" >> poll.log
# Run the poll command
RESULT=$( 2>&1) || true
echo "$RESULT" >> poll.log
# Parse result — adapt to your command's output format
if echo "$RESULT" | grep -q '"status": "completed"'; then
touch done.flag
# Run on-complete command if set
echo "Done." >> poll.log
exit 0
fi
# Save progress
sed -i "s/"poll_count": [0-9]*/"poll_count": $POLL_COUNT/" progress.json
sleep "$INTERVAL"
done
5. 启动与监控
启动被轮询的后台作业
- 首先执行 触发命令(例如:
nlm audio create),以启动后台任务并捕获其 ID/句柄。 - 将返回的 ID 写入
progress.json和task.json。 - 随后以后台进程方式启动轮询脚本。
# In the task's temp dir: nohup bash poll.sh > /dev/null 2>&1 & echo "Polling started in background (PID: $!)"
轮询脚本应独立于 OpenClaw 会话长期存活。 智能体无需保持活跃即可维持轮询运行。
监控策略
- 禁止在 OpenClaw 会话内执行轮询(子智能体或 exec 循环会浪费资源,且增加故障恢复复杂度)。
- 若 OpenClaw 收到用户询问“是否已完成?”的消息,智能体可直接检查临时目录下的
done.flag或poll.log来回应,无需发起新的轮询。 - 若新会话启动后用户要求检查某任务状态,则读取
progress.json判断当前进展。
6. 超时与错误处理
| 情形 | 操作 |
|---|---|
| 达到最大轮询次数(超时) | 记录至 error.log;若配置 timeout_action: notify 则通知用户;不得删除临时目录 |
| 认证过期 | 记录至 error.log;通知用户重新认证后退出 |
| 下载/生成失败 | 记录至 error.log;通知用户后退出 |
| 临时目录已存在(重复启动) | 询问用户:继续还是重启 |
超时/失败后:禁止自动重试。应明确告知用户任务未完成,并提供如下选项:
- 使用相同参数重试
- 调整参数后重试
- 手动清理临时目录
7. 任务完成时的操作
- 验证输出文件是否存在且非空(
[[ -s "$output_path" ]]) - 创建
done.flag - 若已设置
output_path且用户确认了目标路径,则将文件移动或复制至该位置 - 通知用户:
- 任务已完成
- 输出文件保存位置
- 共执行多少次轮询、耗时多久
- 临时目录路径(供需要时人工检查)
- 若用户此前确认保留临时目录,则保持原状;否则,主动提供清理选项
通知语言:使用用户当前会话语言。
8. 模板就绪型任务(高频模式)
若某类任务频繁执行(例如 NotebookLM 音频生成、Gemini Deep Research 状态检查),可将轮询逻辑提取为 可复用的脚本模板,存于分类目录层级:
/tmp/notebooklm-audio/ poll-template.sh ← 此分类专用的可复用模板 /260325-1400_task1/ ← 各个任务目录基于该模板生成 /260326-0915_task2/
各任务目录下的 poll.sh 可直接复制模板,或基于模板生成,从而保证任务目录本身尽可能精简。
9. 总结核查清单
启动轮询任务前,请确认全部满足以下条件:
- 任务适用于轮询(全部适用性条件 ✅)
- 用户已在单条消息中确认全部参数
- 已创建临时目录,且其中
task.json与progress.json内容正确 - 已执行触发命令,并捕获 ID/句柄
- 已编写
poll.sh并通过语法校验(bash -n) - 已使用
nohup启动后台进程 - 已通知用户:任务已启动、如何查询状态、完成时将发生什么
热门AI工具
相关专题
本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。
0
2026.11.06
围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。
0
2026.11.06
详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。
0
2026.11.06
DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。
0
2026.11.05
DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。
0
2026.11.05
本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。
0
2026.11.04
本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。
0
2026.11.04
本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。
0
2026.11.04
本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。
0
2026.11.04
热门下载
相关下载
精品课程
共6课时 | 12.1万人学习
共79课时 | 161.8万人学习
共6课时 | 54.7万人学习
最新文章