Polling Best Practices

Polar Sponsor
爱发电 赞助
.NET 9.0

通过定时轮询自动化长时间运行的异步任务的最佳实践。适用于监控后台 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. 编写轮询脚本

将脚本写入任务临时目录(/poll.sh)。脚本必须 完全自包含 —— 除标准 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. 启动与监控

启动被轮询的后台作业

  1. 首先执行 触发命令(例如:nlm audio create ),以启动后台任务并捕获其 ID/句柄。
  2. 将返回的 ID 写入 progress.json 和 task.json。
  3. 随后以后台进程方式启动轮询脚本。
# 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;通知用户后退出
临时目录已存在(重复启动) 询问用户:继续还是重启

超时/失败后:禁止自动重试。应明确告知用户任务未完成,并提供如下选项:

  1. 使用相同参数重试
  2. 调整参数后重试
  3. 手动清理临时目录

7. 任务完成时的操作

  1. 验证输出文件是否存在且非空([[ -s "$output_path" ]])
  2. 创建 done.flag
  3. 若已设置 output_path 且用户确认了目标路径,则将文件移动或复制至该位置
  4. 通知用户:
    • 任务已完成
    • 输出文件保存位置
    • 共执行多少次轮询、耗时多久
    • 临时目录路径(供需要时人工检查)
  5. 若用户此前确认保留临时目录,则保持原状;否则,主动提供清理选项

通知语言:使用用户当前会话语言。

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 启动后台进程
  • 已通知用户:任务已启动、如何查询状态、完成时将发生什么

相关专题

更多
Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

0

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

0

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

0

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

0

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

0

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

0

16

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习