OpenClaw Cron 定时任务:让 AI 自动为你工作

定时任务(Cron Jobs)是 OpenClaw 强大的自动化功能之一,它允许你预设任务并按计划自动执行。通过 Cron 功能,你的 AI 助手可以在指定时间自动执行各种任务,如发送报告、收集数据、执行检查等。本文将详细介绍 OpenClaw Cron 的配置和使用方法。

Cron 基础概念

什么是 Cron?

Cron 是一个基于时间的任务调度器,最初是 UNIX 系统的内置功能。它允许用户在固定时间、日期或间隔执行命令或脚本。

Cron 表达式

Cron 表达式由 5 个字段组成:

┌───────────── 分钟 (0 - 59)
│ ┌───────────── 小时 (0 - 23)
│ │ ┌───────────── 日期 (1 - 31)
│ │ │ ┌───────────── 月份 (1 - 12)
│ │ │ │ ┌───────────── 星期 (0 - 6, 0 = 周日)
│ │ │ │ │
* * * * *

常用 Cron 表达式

表达式 含义 示例
* * * * * 每分钟 -
0 * * * * 每小时整点 1:00, 2:00
0 0 * * * 每天午夜 00:00
0 8 * * * 每天早上 8 点 08:00
0 8 * * 1-5 工作日早上 8 点 周一至周五 08:00
0 0 * * 0 每周日午夜 周日 00:00
0 0 1 * * 每月第一天 每月1日 00:00
*/15 * * * * 每 15 分钟 -
0 */2 * * * 每 2 小时 2:00, 4:00

OpenClaw Cron 配置

基础配置

config/cron.yaml 中配置定时任务:

# config/cron.yaml
version: 1

# 全局设置
settings:
  # 是否启用 Cron
  enabled: true
  # 时区
  timezone: "Asia/Shanghai"
  # 最大并发任务数
  maxConcurrent: 5
  # 任务超时时间(毫秒)
  timeout: 300000

# 定时任务列表
tasks:
  - name: "daily-report"
    description: "每日报告"
    # Cron 表达式
    schedule: "0 8 * * *"
    # 是否启用
    enabled: true
    # 技能名称
    skill: "daily-report"
    # 传递给技能的参数
    params:
      recipients:
        - "admin@example.com"
      format: "html"

任务配置详解

tasks:
  - name: "task-name"           # 任务名称(必需)
    description: "任务描述"       # 任务描述
    schedule: "0 8 * * *"      # Cron 表达式(必需)
    enabled: true               # 是否启用
    skill: "skill-name"         # 要执行的技能(必需)

    # 传递给技能的参数
    params:
      key: "value"

    # 触发条件(可选)
    conditions:
      # 只在特定日期执行
      dates:
        - "2024-01-01"
      # 只在特定星期几执行
      daysOfWeek:
        - 1  # 周一
        - 5  # 周五

    # 失败重试
    retry:
      enabled: true
      maxAttempts: 3
      delay: 60000  # 60秒

    # 通知设置
    notify:
      onSuccess: false
      onFailure: true
      channels:
        - type: "telegram"
          target: "${ADMIN_ID}"

技能中的 Cron 处理

在技能中接收定时任务的参数:

// skills/daily-report/index.js
module.exports = {
  name: 'daily-report',
  description: '生成每日报告',

  async execute(params, context) {
    // 从 params 获取配置参数
    const recipients = params.recipients || [];
    const format = params.format || 'text';

    // 从 context 获取执行信息
    const executionTime = context.cron?.executionTime;
    const isScheduled = context.cron?.isScheduled;

    // 执行报告生成逻辑
    const report = await generateReport({
      date: executionTime,
      format
    });

    // 发送报告
    for (const recipient of recipients) {
      await sendReport(recipient, report);
    }

    return {
      type: 'text',
      content: `报告已发送给 ${recipients.length} 个收件人`
    };
  }
};

实际应用案例

案例 1:每日数据报告

# 每天早上 8 点发送数据报告
tasks:
  - name: "daily-data-report"
    description: "每日数据汇总报告"
    schedule: "0 8 * * *"
    skill: "data-report"
    params:
      type: "daily"
      channels:
        - "telegram"
        - "discord"

技能实现:

// skills/data-report/index.js
module.exports = {
  name: 'data-report',

  async execute(params, context) {
    const { type, channels } = params;

    // 1. 获取数据
    const data = await fetchDataFromAPI();

    // 2. 生成报告
    const report = generateReport(data, type);

    // 3. 发送到各平台
    const results = [];
    for (const channel of channels) {
      const result = await notifyChannel(channel, report);
      results.push({ channel, success: result });
    }

    // 4. 返回结果摘要
    const successCount = results.filter(r => r.success).length;
    return {
      type: 'text',
      content: `✅ 报告发送完成:成功 ${successCount}/${channels.length}`
    };
  }
};

案例 2:每周周报汇总

# 每周五下午 6 点发送周报
tasks:
  - name: "weekly-summary"
    description: "每周工作汇总"
    schedule: "0 18 * * 5"
    skill: "weekly-summary"
    params:
      period: "week"

案例 3:定时健康检查

# 每 15 分钟检查系统状态
tasks:
  - name: "health-check"
    description: "系统健康检查"
    schedule: "*/15 * * * *"
    skill: "health-checker"
    params:
      checkItems:
        - "api"
        - "database"
        - "storage"
    notify:
      onFailure: true
      channels:
        - type: "telegram"
          target: "${ADMIN_ID}"

案例 4:定时数据同步

# 每小时同步一次数据
tasks:
  - name: "data-sync"
    description: "每小时数据同步"
    schedule: "0 * * * *"
    skill: "data-sync"
    params:
      sources:
        - "github"
        - "jira"
        - "slack"
    conditions:
      # 排除周末
      daysOfWeek: [1, 2, 3, 4, 5]

案例 5:定时内容推送

# 每天早上 9 点推送热门内容
tasks:
  - name: "daily-content-push"
    description: "每日内容推送"
    schedule: "0 9 * * *"
    skill: "content-pusher"
    params:
      platforms:
        - "telegram"
        - "discord"
      contentType: "trending"

案例 6:定时清理任务

# 每天凌晨 3 点清理过期数据
tasks:
  - name: "cleanup-expired"
    description: "清理过期数据"
    schedule: "0 3 * * *"
    skill: "data-cleanup"
    params:
      retentionDays: 30
      targets:
        - "logs"
        - "cache"
        - "temp_files"

案例 7:定时备份

# 每天凌晨 2 点备份数据
tasks:
  - name: "daily-backup"
    description: "每日数据备份"
    schedule: "0 2 * * *"
    skill: "backup-manager"
    params:
      targets:
        - "database"
        - "configs"
      destination: "s3://backup-bucket"
      retention: 7

Cron 高级配置

1. 多个 Cron 表达式

tasks:
  - name: "multi-trigger-task"
    schedule:
      - "0 9 * * *"    # 早上 9 点
      - "0 14 * * *"   # 下午 2 点
      - "0 18 * * *"   # 下午 6 点
    skill: "reminder"

2. 动态参数

tasks:
  - name: "dynamic-task"
    schedule: "0 8 * * *"
    skill: "dynamic-reporter"

    # 使用环境变量或动态值
    params:
      recipients: "${REPORT_RECIPIENTS}"
      threshold: "${NOTIFICATION_THRESHOLD}"

3. 任务依赖

tasks:
  - name: "task-a"
    schedule: "0 8 * * *"
    skill: "task-a"
    output:
      key: "result_a"

  - name: "task-b"
    schedule: "0 9 * * *"
    skill: "task-b"
    dependsOn:
      - "task-a"
    input:
      from: "result_a"

4. 手动触发

除了自动执行,你也可以手动触发定时任务:

# 手动触发某个任务
openclaw cron run daily-report

# 手动触发所有任务
openclaw cron run all

监控与调试

查看任务状态

# 查看所有任务状态
openclaw cron list

# 查看特定任务详情
openclaw cron status daily-report

# 查看任务执行历史
openclaw cron history daily-report --limit 10

日志管理

# config/cron.yaml
settings:
  logging:
    level: "info"
    # 日志保留天数
    retentionDays: 30
    # 日志文件路径
    logFile: "./logs/cron.log"

告警配置

tasks:
  - name: "critical-task"
    schedule: "0 * * * *"
    skill: "critical-task"

    alert:
      enabled: true
      # 连续失败次数阈值
      failureThreshold: 3
      channels:
        - type: "telegram"
          target: "${ADMIN_ID}"
        - type: "email"
          target: "admin@example.com"

常见问题

问题 1:任务不执行

检查: - Cron 表达式是否正确 - 任务是否启用(enabled: true) - 服务是否正常运行 - 时区设置是否正确

问题 2:任务执行时间不准

可能原因: - 时区设置错误 - 系统时间不准确 - 任务执行时间过长

解决方案: - 检查 timezone 设置 - 同步系统时间 - 优化任务执行时间

问题 3:任务重复执行

可能原因: - 多个实例运行 - 重试机制触发

解决方案: - 检查是否启动了多个实例 - 配置任务锁

问题 4:任务超时

解决方案: - 增加超时配置 - 优化任务逻辑 - 拆分大任务为小任务

最佳实践

1. 合理设置执行时间

  • 避开高峰期(如早上 9 点)
  • 重要任务设置重试
  • 长时间任务设置超时

2. 错误处理

tasks:
  - name: "robust-task"
    schedule: "0 8 * * *"
    skill: "robust-task"
    retry:
      enabled: true
      maxAttempts: 3
      delay: 60000

3. 通知机制

notify:
  onSuccess: false  # 成功不通知
  onFailure: true   # 失败通知
  channels:
    - type: "telegram"
      target: "${ADMIN_ID}"

4. 任务分组

# 按功能分组
groups:
  - name: "reports"
    tasks:
      - "daily-report"
      - "weekly-summary"

  - name: "maintenance"
    tasks:
      - "health-check"
      - "cleanup-expired"

总结

OpenClaw 的 Cron 定时任务功能让自动化变得更加简单:

  • 灵活调度:支持标准 Cron 表达式
  • 多种触发:定时、间隔、动态
  • 错误处理:重试、超时、告警
  • 监控日志:完整执行记录

通过合理使用定时任务,你可以让 AI 自动完成各种重复性工作,大幅提升效率。


相关阅读: - OpenClaw 自动化工作流 - OpenClaw 技能开发 - OpenClaw 最佳实践