# Hermes cron 脚本包装模式

## 问题

Hermes cron 任务的 `script` 参数只能识别 `~/.hermes/scripts/` 目录下的文件，且必须写成**相对路径**（不带目录前缀）。如果项目的实际脚本位于其他目录（如 `~/Desktop/Hermes输出-工作类/脚本/cb_sync.sh`），直接配置绝对路径或相对路径都会在运行时报 `Script not found`。

## 典型症状

`hermes cron list` 显示任务状态为 `error`，Last run 报错：
```
Script not found: /Users/liuxinyuan/.hermes/scripts/脚本/cb_sync.sh
```

这意味着 cron 把 `脚本/cb_sync.sh` 解析成了 `~/.hermes/scripts/脚本/cb_sync.sh`，而不是项目目录下的脚本。

## 解决方案：包装脚本

在项目目录保留真实业务脚本，在 `~/.hermes/scripts/` 下放一个只负责转发的包装脚本。

### 1. 真实业务脚本（项目目录）

`~/Desktop/Hermes输出-工作类/脚本/cb_sync.sh` 包含全部业务逻辑，例如：
```bash
#!/bin/bash
set -e
WORKDIR="$HOME/Desktop/Hermes输出-工作类"
CB_ENV="bier-sales-d0gatbvlx288724e9"
LOG="$WORKDIR/数据/cb_sync.log"

echo "=== $(date '+%Y-%m-%d %H:%M:%S') 开始同步 ===" >> "$LOG"
cd "$WORKDIR/数据"
python3 mcp_refresh.py >> "$LOG" 2>&1 || echo "⚠️ mcp_refresh 失败" >> "$LOG"
python3 mcp_kpi_pipeline.py >> "$LOG" 2>&1 || echo "⚠️ mcp_kpi 失败" >> "$LOG"
# ... 其他刷新步骤
```

### 2. 包装脚本（必须放在 ~/.hermes/scripts/）

```bash
cat > ~/.hermes/scripts/cb_sync.sh << 'EOF'
#!/bin/bash
exec bash "$HOME/Desktop/Hermes输出-工作类/脚本/cb_sync.sh"
EOF
chmod +x ~/.hermes/scripts/cb_sync.sh
```

注意：
- 使用 `exec bash` 而不是 `source` 或 `bash -c`，确保真实脚本在当前 shell 环境中执行，返回码正确传递。
- 包装脚本里**不要**包含业务逻辑，只负责定位并转发到真实脚本。

### 3. cron 任务配置

```bash
cronjob create --name "CloudBase数据同步" \
  --schedule "0 */2 * * *" \
  --script cb_sync.sh \
  --no_agent
```

或者更新已有任务：
```bash
cronjob update --job_id <id> --script cb_sync.sh
```

## 检查清单

- [ ] 包装脚本存在：`ls -la ~/.hermes/scripts/cb_sync.sh`
- [ ] 包装脚本可执行：`chmod +x ~/.hermes/scripts/cb_sync.sh`
- [ ] cron 任务使用相对路径：`--script cb_sync.sh`（不是 `脚本/cb_sync.sh` 或绝对路径）
- [ ] 真实业务脚本路径正确，且单独执行通过：`bash ~/Desktop/Hermes输出-工作类/脚本/cb_sync.sh`
- [ ] 验证 cron 任务状态：`hermes cron list`

## 相关脚本

- `~/Desktop/Hermes输出-工作类/脚本/cb_sync.sh`：CloudBase 数据同步业务脚本
- `~/.hermes/scripts/cb_sync.sh`：Hermes cron 包装脚本（转发器）
