
1. OpenClaw 定时任务为什么总在半夜静默失败很多人第一次给 OpenClaw 配 Crontab都会经历同一个剧本白天手动跑publish-schedule-daily.sh一切正常日志刷刷地打文章也发出去了配成定时任务之后第二天早上打开后台一看什么都没发生。没有报错邮件没有日志新增crontab -l里那行配置明明还在。这不是 OpenClaw 的问题也不是 Crontab 坏了而是定时任务的运行环境和你的交互式 Shell 环境根本不是一回事。你在终端里敲命令时PATH、HOME、各种环境变量、当前工作目录都是齐的Cron 拉起进程时环境极简PATH通常只有/usr/bin:/bin工作目录是当前用户的家目录bash甚至可能不是你以为的那个bash。OpenClaw 的发布脚本依赖 Node 运行时、依赖工作区路径、依赖 Cookie 文件这些在 Cron 环境里全部可能找不到。所以「OpenClaw 定时任务配置详解」这件事核心不是把 Crontab 那五个星号写对而是把运行环境、发布脚本、日志监控这三件事串成一条可观测的链路。我试过最省事的做法是让 Crontab 只负责「在正确的时间调用一个绝对路径的包装脚本」所有环境准备、路径切换、日志重定向都塞进这个包装脚本里。这样 Crontab 行永远只有一行排障时只需要看一个文件。这篇文章面向需要自动化构建与部署的开发者交付的是可以直接复制的 Crontab 片段、发布脚本模板、日志监控命令以及任务触发后怎么验证它真的执行成功了。适合谁已经在本地跑通 OpenClaw 发布流程、想把它变成每天自动运行的人以及配了定时任务但一直不生效、想搞清楚到底卡在哪一步的人。下面从 Crontab 表达式讲起一路走到日志监控和故障排查。每一步都给命令和预期结果你可以边看边在自己的机器上验证。2. TaoToken 前置准备给 OpenClaw 发布脚本接上模型能力OpenClaw 的发布脚本本身不生成内容它负责读取当天的文章 JSON、格式化、调用平台接口发布。真正需要模型能力的地方是内容生成、标题润色、摘要提取这些环节。如果你的 OpenClaw 工作流里包含「定时生成文章再发布」那发布脚本在跑之前得先有一个能稳定调用的模型接口。这里我用 TaoToken 来做模型接入层。它的作用是提供一个统一的 API 入口让你在脚本里用标准的 OpenAI 兼容格式调用不同模型不用为每个模型单独改代码。对定时任务来说这点很关键脚本要无人值守运行接口地址和鉴权方式必须固定不能今天换个域名明天换个 Key 格式。先拿 Key。打开 https://taotoken.net/api-keys 登录后创建一个 API Key复制出来。这个 Key 只显示一次建议直接写进环境变量文件而不是硬编码在脚本里。Base URL 用https://taotoken.net/api注意这个地址不带任何查询参数。Model ID 根据你工作流里用的模型填比如做内容生成常用的是通用对话模型做代码相关任务可以选 coding 系列。三个要素记牢Base URL API Key Model ID后面配置文件里会反复用到。如果你用的是 Claude Code 这类工具做内容润色TaoToken 也提供了对应的接入方式文档在 https://taotoken.net/doc 。Cline 的 MCP 配置、Codex 的auth.json配置思路都一样把 Base URL 指向 TaoToken把 Key 填进去Model ID 选对。对定时任务场景我建议把模型配置写成一个独立的环境文件比如~/.openclaw/.env内容大致是这样# ~/.openclaw/.env export TAOTOKEN_BASE_URLhttps://taotoken.net/api export TAOTOKEN_API_KEYsk-你的Key export OPENCLAW_MODEL_ID你的模型ID export OPENCLAW_WORKSPACE$HOME/.openclaw/workspace然后在包装脚本里source这个文件。这样 Crontab 不需要知道任何模型细节脚本自己会把环境准备好。为什么不在 Crontab 行里直接写环境变量因为 Crontab 对环境变量的解析规则和 Shell 不一样%需要转义引号处理也容易出问题写多了必踩坑。如果你还没有 Coding Plan长期跑定时任务建议了解一下 https://taotoken.net/coding-plan 按量或包月的方式对无人值守的自动化任务更友好不用担心某天额度突然耗尽导致发布中断。模型对话的调试入口在 https://taotoken.net/models 配好之后可以先在网页上发一条消息确认 Key 和模型都通再去跑脚本。这一步能省掉后面大量「到底是网络问题还是配置问题」的纠结。3. 可复制配置Crontab 表达式与发布脚本模板这一节是全文的核心给的是能直接抄的配置。先讲 Crontab 表达式再给包装脚本模板最后给 OpenClaw 发布脚本本身的调用方式。Crontab 五个字段的顺序是分钟、小时、日期、月份、星期。星期里 0 和 7 都代表周日。举几个 OpenClaw 场景常用的# 每天 07:00 发布每日文章 0 7 * * * /bin/bash /home/你的用户名/.openclaw/workspace/skills/ai-publisher/scripts/run-publish.sh # 每天 22:00 收集数据指标 0 22 * * * /bin/bash /home/你的用户名/.openclaw/workspace/skills/ai-publisher/scripts/run-fetch.sh # 每周日 22:00 生成周报 0 22 * * 0 /bin/bash /home/你的用户名/.openclaw/workspace/skills/ai-publisher/scripts/run-weekly.sh注意这里调用的不是publish-schedule-daily.sh本身而是run-publish.sh这个包装脚本。包装脚本的作用是把环境准备好再调用真正的业务脚本。这是让定时任务稳定的关键设计。包装脚本模板run-publish.sh#!/bin/bash # OpenClaw 定时发布包装脚本 # 位置~/.openclaw/workspace/skills/ai-publisher/scripts/run-publish.sh set -euo pipefail # 1. 固定 PATH避免 Cron 环境找不到 node/npm export PATH/usr/local/bin:/usr/bin:/bin:$HOME/.nvm/versions/node/$(ls $HOME/.nvm/versions/node 2/dev/null | tail -1)/bin # 2. 加载模型与环境变量 source $HOME/.openclaw/.env # 3. 切换到工作区避免相对路径失效 cd $OPENCLAW_WORKSPACE/skills/ai-publisher # 4. 日志目录与当天日志文件 LOG_DIR$OPENCLAW_WORKSPACE/skills/ai-publisher/logs mkdir -p $LOG_DIR LOG_FILE$LOG_DIR/publish-$(date %Y-%m-%d).log # 5. 记录开始时间 echo [$(date %Y-%m-%d %H:%M:%S)] [INFO] 定时发布任务启动 $LOG_FILE # 6. 调用真正的发布脚本stdout/stderr 全部进日志 if bash scripts/publish-schedule-daily.sh $LOG_FILE 21; then echo [$(date %Y-%m-%d %H:%M:%S)] [INFO] 发布任务执行成功 $LOG_FILE else echo [$(date %Y-%m-%d %H:%M:%S)] [ERROR] 发布任务执行失败退出码 $? $LOG_FILE exit 1 fi这个脚本里有几个细节值得说。set -euo pipefail让脚本遇到错误立即退出不会带着错误状态继续往下跑。PATH里手动拼了 nvm 的 node 路径因为 Cron 不会加载你的.bashrcnvm 管理的 node 在 Cron 里默认是找不到的。cd到工作区是因为 OpenClaw 的发布脚本内部用了相对路径读文章 JSON不切目录会报文件不存在。如果你用 Cline 的 MCP 方式接入模型配置片段长这样放在 Cline 的 MCP 设置里{ mcpServers: { taotoken: { command: npx, args: [-y, taotoken/mcp-server], env: { TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_API_KEY: sk-你的Key, TAOTOKEN_MODEL_ID: 你的模型ID } } } }Codex 的auth.json配置路径通常在~/.codex/auth.json{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: 你的模型ID }Claude Code 的配置在~/.claude/settings.json或项目级.claude/settings.json{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key, ANTHROPIC_MODEL: 你的模型ID } }三件套永远是 Base URL、Key、Model ID缺一个都跑不起来。配好之后把包装脚本加上执行权限chmod x ~/.openclaw/workspace/skills/ai-publisher/scripts/run-publish.sh然后手动跑一次确认脚本本身没问题再去配 Crontab。手动跑的命令bash ~/.openclaw/workspace/skills/ai-publisher/scripts/run-publish.sh跑完看日志文件有没有生成内容对不对。这一步过了Crontab 才有意义。4. 验证请求任务触发后怎么确认真的执行成功配完 Crontab 不代表任务会跑跑了不代表跑成功。这一节讲怎么验证从「任务有没有被触发」到「发布有没有真的生效」一层层往下查。第一层确认 Crontab 配置已经生效crontab -l输出里应该能看到你加的那几行。如果看不到说明保存没成功重新crontab -e编辑。第二层确认 Cron 服务在运行。Linux 上systemctl status cronmacOS 上 Cron 是 launchd 管理的用sudo launchctl list | grep cron服务没起来的话任务永远不会触发。第三层看日志文件有没有新增。这是最直接的证据tail -f ~/.openclaw/workspace/skills/ai-publisher/logs/publish-$(date %Y-%m-%d).log如果日志文件根本没生成说明包装脚本没被执行问题在 Crontab 或 Cron 服务。如果文件生成了但只有「任务启动」没有后续说明包装脚本执行了但业务脚本卡住或报错往下看 stderr 内容。第四层验证模型接口是否通。在包装脚本的环境里手动发一个请求source ~/.openclaw/.env curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: $OPENCLAW_MODEL_ID, messages: [{role: user, content: ping}], max_tokens: 10 }返回里如果有choices字段说明接口通。如果返回 401是 Key 问题如果返回local proxy failed或连接超时是网络或 Base URL 问题如果返回里choices是空的是 Model ID 写错了。第五层验证发布结果。日志里出现「发布成功」还不够去目标平台后台确认文章真的出现了。OpenClaw 的发布脚本通常会在日志里记录平台返回的文章 ID 或 URL拿这个去核对。一个完整的成功日志长这样[2026-03-13 07:00:01] [INFO] 定时发布任务启动 [2026-03-13 07:00:02] [INFO] 读取文章ai-originally-so-008.json [2026-03-13 07:00:03] [INFO] 调用模型生成摘要... [2026-03-13 07:00:08] [INFO] 摘要生成完成 [2026-03-13 07:00:09] [INFO] 发布到 CSDN... [2026-03-13 07:00:45] [INFO] CSDN 发布成功文章 ID: 12345678 [2026-03-13 07:00:46] [INFO] 发布任务执行成功看到最后一行「发布任务执行成功」才算真的成功。中间任何一步断了日志会停在那一行你就知道该查哪里。5. 常见报错排查401、local proxy failed、reading choices、OAuth定时任务跑不起来报错就那么几类。这一节按真实报错信息对照排查每条都给原因和动作。401 Unauthorized。日志里出现401或invalid api key说明 Key 不对或没传。检查~/.openclaw/.env里的TAOTOKEN_API_KEY是不是复制完整了有没有多余空格。Cron 环境里如果没source这个文件Key 就是空的请求自然 401。确认包装脚本里有source $HOME/.openclaw/.env这一行。local proxy failed。这个报错通常出现在请求发不出去的时候可能是 Base URL 写错也可能是本机网络策略拦截。先确认TAOTOKEN_BASE_URL是https://taotoken.net/api没有多余路径。然后用第 4 节的 curl 命令手动测一次curl 通而脚本不通说明是脚本环境问题curl 也不通说明是网络或地址问题。reading choices 相关报错。日志里出现cannot read property choices of undefined或类似说明接口返回的结构和脚本预期的不一样。常见原因是 Model ID 写错接口返回了错误对象而不是正常的 completion 结构。把 Model ID 换成确认可用的再跑一次。也有可能是请求体格式不对比如messages数组为空。OAuth 相关报错。如果你用的是 Claude Code 或 Codex 这类带 OAuth 流程的工具报错里出现OAuth token expired或refresh token failed说明登录态过期了。这类工具需要重新走一次授权或者改用 API Key 方式接入。用 TaoToken 的 API Key 方式可以绕开 OAuth 的过期问题对无人值守的定时任务更合适。任务没触发日志文件都没生成。按顺序查crontab -l有没有那行Cron 服务在不在跑包装脚本路径是不是绝对路径脚本有没有执行权限。Crontab 里必须用绝对路径~在 Crontab 里不一定展开成你的家目录。任务触发了但立刻退出。看日志里有没有「任务启动」后面直接跟「执行失败」。这种情况多半是set -e在某个命令上触发了退出比如source的文件不存在、cd的目录不存在。把包装脚本里的set -euo pipefail临时改成set -x调试能看到每一步执行了什么。发布成功但内容不对。日志显示成功但平台上的文章是旧的或空的。检查 OpenClaw 读取的文章 JSON 路径对不对cd的工作区是不是正确。Cron 的工作目录默认是家目录不cd的话相对路径全错。排查的核心思路是先确认任务被触发再确认脚本被执行再确认接口被调用最后确认结果被写入。四层里哪层断了问题就在哪层。日志文件是唯一的真相来源所有输出都往日志里写不要依赖终端回显。6. 把定时任务接进你的 OpenClaw 工作流到这里Crontab 表达式、包装脚本、日志监控、故障排查都齐了。回到最开始那个问题为什么手动跑正常、定时跑就失败因为定时任务的运行环境是「干净」的你得自己把环境补齐。包装脚本就是干这个的。如果你还没配模型接入先去 https://taotoken.net/api-keys 拿一个 Key把 Base URL、Key、Model ID 三件套写进~/.openclaw/.env。接入文档在 https://taotoken.net/doc 里面有各工具的详细配置。想先试试模型通不通去 https://taotoken.net/models 发条消息最快。长期跑自动化任务的话https://taotoken.net/coding-plan 的额度方式更适合无人值守场景。配好之后建议先手动跑三次包装脚本确认每次都成功再挂 Crontab。挂上之后盯两天日志确认触发时间和执行结果都符合预期。稳定之后就可以不用管了它会每天按时干活日志留在那里出问题随时能查。最后留一个实用习惯每周备份一次 Crontab 配置命令是crontab -l ~/crontab-backup-$(date %Y%m%d).txt。机器重装或迁移时这一行能省你半小时。