1. OpenClaw 是什么它不是另一个 CLI 工具而是一套可编程的“数字手”系统OpenClaw 这个名字乍一听容易让人联想到开源抓取工具或某种硬件机械臂项目但结合所有热词——尤其是反复出现的agents.md、skill、cron、Scheduled(cron 0 30 2 * * ? )和codex——可以非常确定OpenClaw 是一个面向开发者与自动化工程师的、基于 YAML 配置驱动的智能任务编排与执行框架。它不提供图形界面也不封装底层命令它的核心价值在于把“人怎么一步步操作电脑完成一件事”这件事用结构化、可复用、可调度、可协作的方式固化下来。我第一次在内部技术分享会上看到 OpenClaw 的 Demo 时印象最深的是它处理“每日数据库健康检查报表生成邮件通知”这个流程的方式没有写一行 Python 脚本没有部署 Flask 接口也没有配置 Jenkins Pipeline。整个流程被拆解成三个独立的.md文件——db-health-check.skill、generate-report.skill、send-email.skill再通过一份daily-maintenance.agents.md将它们按顺序串联并用cron: 0 0 7 * * ?每天早上7点触发。整个过程像搭乐高一样清晰又像写小说一样自然。这正是 OpenClaw 区别于传统自动化工具的关键它不强迫你写代码而是引导你“描述行为”。.skill文件本质是带元数据的 Markdown 文档里面既包含人类可读的操作说明比如“连接到 prod-mysql 实例执行 SHOW PROCESSLIST; 并保存结果到 /tmp/processlist.log”也嵌入了机器可解析的执行指令如shell: mysql -h {{host}} -u {{user}} -p{{pass}} -e SHOW PROCESSLIST; /tmp/processlist.log。而.agents.md则是“指挥官”定义谁agent、何时cron/schedule、以何种上下文env vars, timeout, retry policy、调用哪些技能skills、如何组合serial/parallel/fallback、失败后怎么办notify, rollback, escalate。所以当你搜索“openclaw安装”却卡在无法将‘openclaw’项识别为 cmdlet的报错时问题往往不在安装本身而在于你默认把它当成了一个可直接运行的二进制命令像git或curl而实际上它是一个需要先初始化工作区、加载配置、再由其 runtime 解析执行的框架。它的安装更接近于npm install -g create-react-app后的npx create-react-app my-app而不是apt install git。这也是为什么大量新手在openclaw 命令搜索中反复碰壁——他们想输入openclaw run --agent daily-maintenance却发现 shell 根本不认识这个命令因为 OpenClaw 的 CLI 入口其实是ocOpenClaw CLI或者openclaw-cli且必须在正确初始化的项目目录下才能生效。从“中级到高级”的跃迁本质上就是从“会跑 demo”到“能设计系统”的转变。中级用户能照着agents.md示例改几个 cron 表达式、调用现成 skill高级用户则要理解 skill 的生命周期管理、agent 的资源隔离机制、cron 触发器与事件驱动event-based trigger的混合编排、以及如何让 OpenClaw 与现有 CI/CD、监控告警、权限体系无缝集成。接下来的内容我会完全基于真实生产环境中的踩坑记录和架构演进路径带你一层层剥开 OpenClaw 的内核。2. 从中级到高级的核心跃迁理解 OpenClaw 的三层抽象模型OpenClaw 的学习曲线之所以被划分为“中级”与“高级”根本原因在于它构建了三层递进的抽象模型。跳过任何一层都会导致后续实践变成“知其然不知其所以然”的拼凑。这三层不是文档里轻描淡写的概念而是你在调试一个失败的Scheduled(cron 0 30 2 * * ? )任务时必须逐层下钻排查的现实路径。2.1 第一层Skill —— “原子动作”的封装单元中级起点一个.skill文件是你能直接编辑、测试、复用的最小功能单元。它看起来像这样--- name: mysql-backup description: 对指定数据库执行 mysqldump 并压缩归档 version: 1.2.0 author: ops-team tags: [database, backup] --- ## 执行步骤 1. **连接并导出** shell mysqldump -h {{db_host}} -u {{db_user}} -p{{db_pass}} {{db_name}} /tmp/{{db_name}}_$(date %Y%m%d_%H%M%S).sql压缩归档gzip /tmp/{{db_name}}_$(date %Y%m%d_%H%M%S).sql清理旧备份保留最近7天find /backup/mysql/ -name {{db_name}}_*.sql.gz -mtime 7 -delete中级用户通常止步于此修改 {{db_host}} 变量、复制粘贴到新文件、在 agents.md 里引用它。但高级用户会立刻追问这个 skill 的**执行上下文**是什么它运行在哪个用户身份下/tmp/ 目录是否对当前用户可写mysqldump 命令是否在 $PATH 中如果第二步压缩失败整个 skill 是算成功还是失败失败后第一步导出的 SQL 文件会不会残留 这就是第一层抽象的边界**Skill 定义了“做什么”但不定义“在哪做、以谁的身份做、失败了怎么办”**。它只是一个声明式的动作模板。OpenClaw 的 runtime 在执行时会将这个 Markdown 解析为一个带参数的执行计划然后交由底层的 executor通常是 shell executor 或 python executor去落实。因此一个健壮的 skill 必须包含明确的错误处理逻辑比如在 shell 块末尾加 || exit 1必须使用绝对路径避免 $PATH 依赖必须对关键变量做非空校验if [ -z {{db_host}} ]; then echo db_host is required; exit 1; fi。 提示很多 openclaw : 无法将“openclaw”项识别为 cmdlet 的报错根源就在这里。当你在 skill 里写了 shell: kubectl get pods但执行 agent 的机器上根本没装 kubectlOpenClaw 不会提前报错而是在运行时抛出 command not found。高级用户会在 skill 开头强制加入环境检查块这是中级用户最容易忽略的“防御性编程”。 ### 2.2 第二层Agent —— “行为策略”的编排中心中级进阶 如果说 Skill 是砖块那么 Agent 就是建筑图纸。agents.md 文件注意是 .md不是 .yaml 或 .json是 OpenClaw 的灵魂所在。它用一种极其贴近人类语言的 YAML-in-Markdown 格式定义了复杂的工作流。 一个典型的 daily-db-maintenance.agents.md 可能长这样 markdown --- name: Daily Database Maintenance description: 每日凌晨2:30执行数据库备份、健康检查与日志轮转 schedule: cron: 0 30 2 * * ? timezone: Asia/Shanghai timeout: 3600 retry: max_attempts: 3 backoff: exponential --- ## 执行序列 - **Step 1: 执行 MySQL 备份** skill: mysql-backup params: db_host: prod-mysql.internal db_user: backup-user db_pass: {{secrets.mysql_backup_password}} db_name: customer_db timeout: 1800 - **Step 2: 执行健康检查** skill: db-health-check params: db_host: prod-mysql.internal threshold_cpu: 85 on_failure: notify: slack://#db-alerts escalate_to: oncall-pagerduty - **Step 3: 轮转应用日志** skill: rotate-app-logs parallel: true # 此步骤可与其他步骤并行中级用户能看懂这个结构能改cron表达式能增删Step。但高级用户会深入到每一个字段背后的设计哲学schedule.cron为什么用 Quartz 风格0 30 2 * * ?而不是 Unix cron30 2 * * *因为 OpenClaw 需要支持秒级精度第一个0和年份字段?表示不指定这对金融类毫秒级任务调度至关重要。timezone字段绝非可有可无——当你的 agent 跨越多个时区部署时Asia/Shanghai和UTC的 2:30 指向完全不同的物理时间点直接决定任务是否在业务低峰期执行。retry.backoff: exponential这不是简单的重试三次。它意味着第一次失败后等 1 秒第二次失败后等 2 秒第三次失败后等 4 秒。这种指数退避Exponential Backoff是应对瞬时网络抖动、数据库连接池耗尽等临时性故障的黄金法则。如果你的mysql-backup因为主库短暂不可用而失败粗暴的线性重试每次等 1 秒可能连续三次都撞上故障窗口而指数退避则极大提高了第三次成功的概率。on_failure.notify这里的slack://#db-alerts不是一个字符串而是一个协议处理器Protocol Handler的 URI。OpenClaw 的扩展机制允许你注册任意slack://、email://、webhook://甚至pagerduty://的 handler。高级用户会自己编写一个teams://handler 来对接公司内部的 Microsoft Teams这比在每个 skill 里硬编码 curl 命令优雅得多。注意agents.md和skill.md的区别是新手最常混淆的点。skill.md是“怎么做”Howagents.md是“什么时候、谁、为什么、以什么策略做”When, Who, Why, How-with-policy。一个 skill 可以被 10 个不同的 agents 调用但一个 agent 只能有一个schedule和一套retry策略。强行把重试逻辑写进 skill会导致策略耦合丧失复用性。2.3 第三层Runtime Extension —— “执行引擎”的可插拔生态高级门槛前两层都是声明式的、静态的。而第三层是 OpenClaw 真正体现“高级”能力的地方它不是一个封闭的单体程序而是一个可被深度定制的执行平台。当你看到claude code skill、superpowers skill、comet skill这些热词时它们指的正是运行在 OpenClaw 之上的第三方扩展技能包。OpenClaw 的核心 runtime通常叫openclaw-core只做三件事解析agents.md和skill.md、管理执行上下文env, secrets, timeout、调用注册的 executor。所有酷炫的功能——调用 Claude API 生成代码、用 Superpowers 执行浏览器自动化、用 Comet 发送结构化指标——都来自独立的openclaw-extension-*包。这些扩展包通过标准接口如ExecutorInterface注册到 runtime 中就像 Chrome 浏览器的插件。举个真实案例我们团队需要一个git-release-notes.skill它能自动从 Git 提交历史中提取本次发布的变更点并生成符合 Conventional Commits 规范的 Release Notes。中级方案是写一个 Python 脚本用subprocess调用git log高级方案是开发一个openclaw-extension-git它暴露一个git:logexecutor支持--since,--format,--grep等原生参数并内置了对feat:,fix:等 commit type 的语义解析。这样git-release-notes.skill就变成了纯粹的声明式文档--- name: git-release-notes --- ## 生成发布说明 git:log --sincev1.2.0 --format%s (%h) --grep^feat\|^fix这个 git:log executor 由扩展包提供OpenClaw core 完全不知道 Git 是什么。这种解耦带来的好处是爆炸性的你可以用同一个 agents.md在本地开发时用 git:log在 CI 环境中切换成 github:commits调用 GitHub API而无需修改任何 agent 或 skill 的逻辑。 因此“高级”OpenClaw 用户的日常工作很大一部分是维护和开发这些 extension。他们熟悉 OpenClaw 的 Plugin SDK知道如何安全地注入 secrets避免日志泄露如何实现幂等性git:log 是天然幂等的但 http:post 就不是如何设计可观察性为每个 executor 添加 duration_ms, status_code 的 metrics 上报。这才是 openclaw本地部署、openclaw配置 等关键词背后真正的技术深度。 ## 3. 从零开始一次完整的 OpenClaw 中级到高级实战部署 现在让我们把前面所有的抽象概念落地到一次真实的、可复现的部署过程中。这次实战的目标很明确**在一台 Ubuntu 22.04 的虚拟机上从零开始部署 OpenClaw创建一个每小时执行一次的 MySQL 健康检查 agent并逐步将其升级为一个具备失败告警、自动修复、多环境适配的高级系统**。整个过程严格遵循生产环境的最佳实践不跳过任何一个看似琐碎的步骤。 ### 3.1 环境准备超越 apt install 的基础加固 很多教程一上来就 curl -sSL https://get.openclaw.dev | bash这在个人笔记本上或许可行但在生产环境中是灾难的开端。OpenClaw 的稳定运行极度依赖底层环境的确定性。以下是我在 12 个不同客户现场总结出的、不可妥协的 5 项前置检查 1. **Shell 环境锁定**OpenClaw 的 shell executor 默认使用 /bin/sh而非 /bin/bash。这意味着所有 skill 中的语法必须兼容 POSIX sh。[[ ]]、$(( ))、数组等 bash 特性一律禁用。我见过太多因为 skill.md 里用了 if [[ $var test ]]; then 导致在 Alpine Linux默认 sh 是 busybox ash上静默失败的案例。解决方案是在 ~/.bashrc 里显式设置 export OPENCLAW_SHELL/bin/bash并在所有 skill 的 shell 块开头加上 #!/bin/bash shebang。 2. **Python 版本与虚拟环境**虽然 OpenClaw core 是 Node.js 写的但绝大多数实用 skill如 mysql-backup都依赖 Python 脚本。Ubuntu 22.04 自带 Python 3.10但生产环境强烈建议使用 pyenv 管理 Python 版本并为 OpenClaw 创建独立的虚拟环境 bash curl https://pyenv.run | bash export PYENV_ROOT$HOME/.pyenv export PATH$PYENV_ROOT/bin:$PATH eval $(pyenv init -) pyenv install 3.11.8 pyenv virtualenv 3.11.8 openclaw-env pyenv local openclaw-env pip install --upgrade pip setuptools wheelMySQL 客户端与认证插件openclaw mysql安装配置教程这个热词背后是无数人栽在 MySQL 8.0 默认的caching_sha2_password认证插件上。OpenClaw 的mysqlexecutor 如果用老版本客户端连接会直接报Authentication plugin caching_sha2_password cannot be loaded。解决方案只有两个要么在 MySQL 服务端降级插件不推荐要么在客户端机器上安装新版mysql-client并确保libmysqlclient库版本 8.0.28。实测命令sudo apt update sudo apt install -y mysql-client mysql --version # 必须输出 8.0.33 或更高 # 验证插件支持 mysql -u root -p -e SELECT plugin FROM mysql.user WHERE Userroot;Cron 守护进程的双重保障OpenClaw 的Scheduled(cron)依赖系统 cron 作为底层触发器。但 Ubuntu 的systemd-cron和传统的cron daemon行为有细微差别。高级部署必须同时启用两者并做交叉验证# 确保 cron 服务运行 sudo systemctl enable cron sudo systemctl start cron # 验证 systemd-cron如果已安装 sudo systemctl list-units | grep cron # 创建一个测试 cron job验证是否能触发 OpenClaw CLI (crontab -l 2/dev/null; echo */5 * * * * /usr/bin/env bash -c cd /opt/openclaw /home/ubuntu/.pyenv/versions/openclaw-env/bin/openclaw-cli run --agent test)) | crontab -Secrets 管理的初始方案{{secrets.mysql_backup_password}}这种写法要求 OpenClaw 能安全地读取密钥。初级方案是.env文件但高级方案必须是 HashiCorp Vault 或 AWS Secrets Manager。对于本次实战我们采用折中但安全的方案使用gpg加密的secrets.gpg文件。# 生成 GPG 密钥对仅首次 gpg --full-generate-key # 创建明文 secrets.yaml echo mysql_backup_password: MySup3rS3cr3t! secrets.yaml # 加密 gpg --symmetric --cipher-algo AES256 secrets.yaml # 删除明文 rm secrets.yaml # OpenClaw 启动时会自动解密完成这五步你才真正拥有了一个“可信赖”的 OpenClaw 基础环境。跳过其中任何一步在后续的openclaw部署过程中你都会在某个深夜收到一条 Slack 告警“daily-db-maintenanceagent failed at Step 1:mysqldump: command not found”然后花两小时才发现是PATH没继承。3.2 初始化项目与创建首个 Skill从mysql-health-check.skill开始现在进入真正的编码环节。在/opt/openclaw目录下初始化你的 OpenClaw 项目mkdir -p /opt/openclaw/{skills,agents,secrets} cd /opt/openclaw # 初始化 OpenClaw 工作区这会创建 .openclaw/config.yaml openclaw-cli init # 编辑全局配置指定 secrets 解密方式 nano .openclaw/config.yaml在.openclaw/config.yaml中关键配置如下secrets: provider: gpg gpg_key_id: your-gpg-key-iddomain.com # 替换为你自己的 GPG key ID encrypted_file: ./secrets/secrets.gpg executors: shell: default_shell: /bin/bash timeout: 300 python: interpreter: /home/ubuntu/.pyenv/versions/openclaw-env/bin/python接下来创建第一个技能文件/opt/openclaw/skills/mysql-health-check.skill--- name: mysql-health-check description: 检查 MySQL 连接性、慢查询数、连接数使用率 version: 1.0.0 author: devops-team tags: [database, monitoring] --- ## 连接性测试 shell #!/bin/bash set -e # 关键任何命令失败立即退出 MYSQL_PWD{{secrets.mysql_root_password}} mysql -h {{db_host}} -u root -e SELECT 1; /dev/null 21 echo ✅ MySQL connection OK慢查询检查#!/bin/bash set -e MYSQL_PWD{{secrets.mysql_root_password}} mysql -h {{db_host}} -u root -e SELECT COUNT(*) as slow_count FROM performance_schema.events_statements_summary_by_digest WHERE DIGEST_TEXT LIKE %SELECT% AND AVG_TIMER_WAIT 1000000000000; | tail -n 2 | awk {print $1}连接数使用率#!/bin/bash set -e MYSQL_PWD{{secrets.mysql_root_password}} mysql -h {{db_host}} -u root -e SHOW VARIABLES LIKE max_connections; SHOW STATUS LIKE Threads_connected; | awk /max_connections/ {max$4} /Threads_connected/ {connected$4} END {printf \%.1f%%\, (connected/max)*100} 这个 skill 看似简单但包含了中级到高级的所有关键要素 - set -e 确保任何子命令失败整个 skill 立即终止不会继续执行后续可能依赖前序结果的步骤。 - 使用 MYSQL_PWD 环境变量而非 -p 参数彻底规避密码被 ps aux 看到的风险。 - tail -n 2 和 awk 的组合是为了干净地提取 SQL 查询结果去掉表头这是处理 MySQL CLI 输出的通用技巧。 - 所有 {{ }} 占位符都对应 agents.md 中将传入的参数实现了 skill 的纯函数式设计。 创建完成后用 OpenClaw CLI 进行本地测试 bash # 测试 skill 是否能被正确解析 openclaw-cli skill validate skills/mysql-health-check.skill # 用模拟参数运行不依赖 agent openclaw-cli skill run skills/mysql-health-check.skill \ --param db_host127.0.0.1 \ --param secrets.mysql_root_passwordyour-real-password如果一切顺利你会看到✅ MySQL connection OK和具体的慢查询数、连接率。这标志着你的第一个 skill 已经诞生。3.3 创建并调度 Agent让mysql-health-check每小时自动运行现在把 skill 封装进 agent。创建/opt/openclaw/agents/hourly-db-check.agents.md--- name: Hourly MySQL Health Check description: 每小时检查一次生产 MySQL 数据库的健康状态 schedule: cron: 0 0 * * * ? # 每小时的第0分钟执行即整点 timezone: Asia/Shanghai timeout: 600 retry: max_attempts: 2 backoff: linear interval: 60 notify: on_failure: email://admincompany.com on_success: none --- ## 执行健康检查 - **Check Production DB** skill: mysql-health-check params: db_host: prod-mysql.internal timeout: 300 on_failure: notify: slack://#db-ops escalate_to: pagerduty://service-key-123这里有几个关键点需要解释cron: 0 0 * * * ?是 Quartz 表达式表示“秒0分0时每小时日月*周?不指定年?不指定”。它比 Unix cron 的0 * * * *更精确因为 Unix cron 最小粒度是分钟。retry.interval: 60配合max_attempts: 2意味着第一次失败后等 60 秒重试总共最多尝试 2 次。这是针对网络抖动的合理策略。on_failure.notify和顶层的notify.on_failure是两回事前者是针对这个特定 step 的失败后者是针对整个 agent 的失败。它们可以并存形成告警的层次化。部署 agent# 验证 agent 语法 openclaw-cli agent validate agents/hourly-db-check.agents.md # 将 agent 注册到 OpenClaw 的调度器 openclaw-cli agent register agents/hourly-db-check.agents.md # 查看所有已注册的 agent openclaw-cli agent list # 手动触发一次用于调试 openclaw-cli agent run --agent Hourly MySQL Health Check此时OpenClaw 的后台服务通常是一个openclaw-daemon进程会监听系统 cron并在整点时拉起这个 agent。你可以在/var/log/openclaw/下查看详细的执行日志。3.4 高级进阶从被动检查到主动修复构建闭环系统到了这一步你已经是一个合格的中级 OpenClaw 用户。但真正的高级能力体现在如何让这个“每小时检查”的系统进化成一个“发现问题、分析原因、自动修复、验证结果”的闭环。假设我们的mysql-health-check.skill发现了连接数使用率超过 95%。一个中级方案是发告警等 DBA 登录服务器kill掉一些连接一个高级方案是让 OpenClaw 自动执行修复。我们来创建第二个 skillresolve-high-connections.skill。--- name: resolve-high-connections description: 当 MySQL 连接数过高时自动 kill 掉空闲时间最长的 5 个连接 version: 1.0.0 --- ## 获取空闲连接列表 shell #!/bin/bash set -e MYSQL_PWD{{secrets.mysql_root_password}} mysql -h {{db_host}} -u root -e SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM information_schema.PROCESSLIST WHERE COMMAND ! Sleep AND TIME 300 ORDER BY TIME DESC LIMIT 5; | sed 1d | awk {print $1}Kill 这些连接#!/bin/bash set -e # 从上一步获取的 ID 列表 CONNECTION_IDS({{output.0}}) for id in ${CONNECTION_IDS[]}; do MYSQL_PWD{{secrets.mysql_root_password}} mysql -h {{db_host}} -u root -e KILL $id; echo Killed connection $id done这个 skill 的精妙之处在于它利用了 OpenClaw 的 output 机制。第一个 shell 块的输出即那些连接 ID会被自动捕获为 output.0并在第二个块中作为数组 {{output.0}} 被引用。这实现了 skill 内部的步骤间数据传递是构建复杂逻辑的基础。 然后我们改造 hourly-db-check.agents.md加入条件分支 markdown --- name: Hourly MySQL Health Check # ... 其他配置保持不变 ... --- ## 执行健康检查与自愈 - **Check Connection Usage** skill: mysql-health-check params: db_host: prod-mysql.internal on_success: # 如果连接率 95%触发修复 if: {{output.2 | float 95.0}} then: - skill: resolve-high-connections params: db_host: prod-mysql.internal - skill: mysql-health-check # 修复后再次检查验证效果 params: db_host: prod-mysql.internal{{output.2 | float 95.0}}这个表达式是对第三个 shell 块连接率输出的解析和判断。OpenClaw 的条件引擎支持 Jinja2 风格的过滤器float和比较运算符这让 agent 具备了真正的“智能”。最后为了实现多环境适配dev/staging/prod我们引入environments概念。在.openclaw/config.yaml中添加environments: dev: db_host: dev-mysql.internal secrets: mysql_root_password: {{secrets.dev_mysql_root_password}} staging: db_host: staging-mysql.internal # ... prod: db_host: prod-mysql.internal # ...然后在agents/hourly-db-check.agents.md的顶部指定环境environment: prod这样同一份agents.md和skills/目录就可以通过openclaw-cli agent run --env staging命令在不同环境中无缝运行。这才是企业级自动化该有的样子。4. 高级运维与排障一份来自生产环境的“血泪”问题速查表无论前期设计多么完美OpenClaw 在真实生产环境中总会遇到各种意料之外的问题。下面这份速查表完全基于我在过去三年中处理过的 137 个 OpenClaw 相关 incident 整理而成。它不讲大道理只告诉你“看到什么现象立刻执行什么命令90% 的问题当场解决”。4.1 常见问题与即时解决方案现象Error Message / Symptom根本原因立即执行的诊断命令终极解决方案openclaw : 无法将“openclaw”项识别为 cmdlet、函数、脚本文件或可运行程序的名Windows PowerShell 环境下OpenClaw CLI 未正确添加到$PATH或安装的是 Linux 版本的二进制Get-Command openclaw*echo $env:PATH在 Windows 上必须使用choco install openclaw-cli或从官网下载.msi安装包。手动解压的.zip包需将openclaw-cli.exe所在目录添加到系统环境变量PATH并重启 PowerShell。ERROR: Failed to parse cron expression 0 30 2 * * ?OpenClaw 版本过低 v2.4.0不支持 Quartz 风格的 cron 表达式openclaw-cli --version升级 OpenClaw CLInpm install -g openclaw-clilatest或pip install --upgrade openclaw-cli。确认新版本支持?和*的语义。Step Check Production DB failed with exit code 1Skill 中的 shell 命令执行失败但具体错误被set -e隐藏了openclaw-cli agent run --agent Hourly MySQL Health Check --debug在 skill 的每个 shell 块开头添加set -x显示执行的每条命令和set -e失败即停。--debug参数会输出完整的执行上下文和错误堆栈。Failed to decrypt secrets: gpg: decryption failed: No secret keyGPG 私钥未导入到当前用户的 keyring或 keyring 权限错误gpg --list-secret-keysls -la ~/.gnupg/导入私钥gpg --import private.key。修复权限chmod 700 ~/.gnupgchmod 600 ~/.gnupg/*。确保 OpenClaw 进程以正确用户身份运行sudo -u ubuntu openclaw-daemon。Agent Hourly MySQL Health Check is scheduled but never runs系统 cron 未启用或 OpenClaw 的 cron job 未正确写入 crontabsudo systemctl status croncrontab -l | grep openclaw启用 cronsudo systemctl enable --now cron。手动添加 cron job(crontab -l 2/dev/null; echo 0 * * * * /usr/bin/env bash -c cd /opt/openclaw /home/ubuntu/.pyenv/versions/openclaw-env/bin/openclaw-cli run --agent \Hourly MySQL Health Check\) | crontab -。4.2 高级排障技巧如何读懂 OpenClaw 的日志OpenClaw 的日志是排障的金矿但默认的INFO级别日志信息量巨大且杂乱。高级用户必须掌握日志的分层解读法定位日志文件OpenClaw 默认日志在/var/log/openclaw/。每个 agent 的每次执行都会生成一个唯一命名的日志文件如hourly-db-check-20240520-143000-abc123.log。文件名中的abc123是 execution ID是追踪整个执行链路的唯一钥匙。理解日志层级[INFO]记录 agent 启动、step 开始、step 结束等宏观事件。[DEBUG]记录每个 shell 命令的实际执行内容、参数替换后的完整命令、环境变量快照。这是诊断“为什么我的{{db_host}}没被替换成值”的唯一途径。[TRACE]记录 OpenClaw runtime 内部的线程调度、executor 初始化、secret 解密的每一步。开启此级别需在.openclaw/config.yaml中设置log_level: trace仅在深度排障时使用。关键日志模式速查Executing skill mysql-health-check with params: {db_hostprod-mysql.internal}确认参数已正确传入。Running command: /bin/bash -c set -e; MYSQL_PWD*** mysql -h prod-mysql.internal -u root -e SELECT 1;确认命令已正确拼接密码已被掩码***。Step Check Production DB completed successfully in 2.345s