⏰ 排程與自動化

重複性的任務應該交給機器。透過 Cron 排程Heartbeat 定期檢查,讓你的 AI 夥伴成為不知疲倦的自動化助手。


Cron 排程基礎

什麼是 Cron?

Cron 是 Linux/Unix 系統的定時任務排程器。你可以設定「什麼時間執行什麼指令」,系統就會準時自動執行。

Cron 語法格式

┌───────────── 分鐘 (0 - 59)
│ ┌───────────── 小時 (0 - 23)
│ │ ┌───────────── 日期 (1 - 31)
│ │ │ ┌───────────── 月份 (1 - 12)
│ │ │ │ ┌───────────── 星期 (0 - 6, 0=星期日)
│ │ │ │ │
│ │ │ │ │
* * * * *  要執行的指令

常用 Cron 範例

{`# 每天早上 8 點執行
0 8 * * * /path/to/script.sh

# 每小時執行
0 * * * * /path/to/script.sh

# 每 15 分鐘執行
*/15 * * * * /path/to/script.sh

# 每週一早上 9 點執行
0 9 * * 1 /path/to/script.sh

# 每月 1 號凌晨 3 點執行
0 3 1 * * /path/to/script.sh

# 工作日(週一到週五)每小時執行
0 * * * 1-5 /path/to/script.sh

# 每天 9點、12點、18點執行
0 9,12,18 * * * /path/to/script.sh`}

設定 Cron 任務

{`# 1. 編輯 crontab 檔案
crontab -e

# 2. 加入你的排程(範例:每天備份資料庫)
0 2 * * * cd /home/node/.openclaw/workspace && ./scripts/backup-db.sh

# 3. 查看目前設定的任務
crontab -l

# 4. 刪除所有任務(小心使用!)
crontab -r`}

Heartbeat 定期檢查

Heartbeat 是什麼?

Heartbeat 是 RealVco 的定期健康檢查機制。不同於 Cron 的「定時執行」,Heartbeat 是「定時檢查狀態,有需要才行動」。

Heartbeat vs Cron

特性CronHeartbeat
執行方式固定時間強制執行檢查狀態後決定是否行動
適合場景備份、報表發送監控、健康檢查
靈活性時間固定可根據狀態調整
資源消耗固定有問題時才消耗

Heartbeat 工作流程

┌─────────────────────────────────────────────────────────┐
│                    Heartbeat 循環                        │
├─────────────────────────────────────────────────────────┤
│                                                          │
│   ┌─────────────┐                                        │
│   │  啟動檢查    │ ◄──────────────────────────┐          │
│   └──────┬──────┘                            │          │
│          │                                    │          │
│          ▼                                    │          │
│   ┌─────────────┐     正常      ┌─────────┐   │          │
│   │ 檢查系統狀態 │ ────────────→ │ 記錄 log │   │          │
│   └──────┬──────┘               └────┬────┘   │          │
│          │                           │         │          │
│          │ 異常                       │         │          │
│          ▼                           │         │          │
│   ┌─────────────┐                    │         │          │
│   │  執行對應   │                    │         │          │
│   │  處理流程   │                    │         │          │
│   └──────┬──────┘                    │         │          │
│          │                           │         │          │
│          ▼                           │         │          │
│   ┌─────────────┐                    │         │          │
│   │  通知管理員  │                    │         │          │
│   └─────────────┘                    │         │          │
│                                      │         │          │
│   └──────────────────────────────────┘         │          │
│                等待下一次排程(約 30 分鐘)        │          │
│                                                │          │
└────────────────────────────────────────────────┘          │
                             │                              │
                             └──────────────────────────────┘

Heartbeat 設定檔

{`# HEARTBEAT.md - 定期檢查任務清單

## 系統資源檢查

頻率:每 2 小時
任務:
- [ ] 檢查磁碟空間使用率(警告閾值:80%)
- [ ] 檢查記憶體使用率(警告閾值:90%)
- [ ] 檢查 CPU 負載
- [ ] 記錄檢查結果到日誌

## 服務健康檢查

頻率:每 30 分鐘
任務:
- [ ] 檢查 Nginx 服務狀態
- [ ] 檢查資料庫連線
- [ ] 檢查 Docker 容器狀態
- [ ] 檢查 SSL 憑證有效期

## 專案進度檢查

頻率:每天 4 次
任務:
- [ ] 檢查 git 是否有未提交變更
- [ ] 檢查是否有待處理的工作項目
- [ ] 更新專案進度追蹤表

## 行事曆提醒

頻率:每 5 分鐘
任務:
- [ ] 檢查即將到來的會議
- [ ] 發送提醒通知
- [ ] 預告明日行程`}

Heartbeat 狀態追蹤

{`{
  "lastChecks": {
    "systemResources": "2026-03-21T08:00:00Z",
    "serviceHealth": "2026-03-21T08:30:00Z",
    "projectProgress": "2026-03-21T08:00:00Z"
  },
  "alerts": {
    "diskSpace": {
      "status": "ok",
      "lastAlert": null,
      "threshold": 80
    },
    "memory": {
      "status": "warning",
      "lastAlert": "2026-03-21T06:00:00Z",
      "threshold": 90
    }
  },
  "checkCount": {
    "today": 24,
    "thisWeek": 168
  }
}`}

常見自動化任務範例

1. 資料庫備份

{`#!/bin/bash
# 每日資料庫備份腳本

BACKUP_DIR="/backup/database"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="myapp"
RETENTION_DAYS=7

# 建立備份目錄
mkdir -p "$BACKUP_DIR"

# 執行備份
echo "開始備份資料庫..."
mysqldump -u root -p"$DB_PASSWORD" "$DB_NAME" | gzip > "$BACKUP_DIR/db_${DATE}.sql.gz"

# 檢查備份是否成功
if [ $? -eq 0 ]; then
    echo "✅ 備份成功: db_${DATE}.sql.gz"
    
    # 上傳到雲端儲存(可選)
    # aws s3 cp "$BACKUP_DIR/db_${DATE}.sql.gz" s3://my-backup-bucket/
    
    # 發送通知
    curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
        -d "chat_id=$ADMIN_CHAT_ID" \
        -d "text=✅ 資料庫備份完成:db_${DATE}.sql.gz"
else
    echo "❌ 備份失敗"
    curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
        -d "chat_id=$ADMIN_CHAT_ID" \
        -d "text=🚨 資料庫備份失敗,請立即檢查!"
fi

# 清理舊備份(保留 7 天)
find "$BACKUP_DIR" -name "db_*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "已清理 $RETENTION_DAYS 天前的備份"`}

2. SSL 憑證到期提醒

{`#!/bin/bash
# SSL 憑證到期檢查

DOMAIN="example.com"
WARN_DAYS=14

# 取得憑證到期日
EXPIRY_DATE=$(echo | openssl s_client -servername "$DOMAIN" -connect "$DOMAIN:443" 2>/dev/null | \
    openssl x509 -noout -dates | grep notAfter | cut -d= -f2)

# 計算剩餘天數
EXPIRY_TIMESTAMP=$(date -d "$EXPIRY_DATE" +%s)
CURRENT_TIMESTAMP=$(date +%s)
DAYS_UNTIL_EXPIRY=$(( (EXPIRY_TIMESTAMP - CURRENT_TIMESTAMP) / 86400 ))

if [ "$DAYS_UNTIL_EXPIRY" -lt "$WARN_DAYS" ]; then
    MESSAGE="⚠️ SSL 憑證警告\\n\\n"
    MESSAGE+="域名:$DOMAIN\\n"
    MESSAGE+="到期日:$EXPIRY_DATE\\n"
    MESSAGE+="剩餘:$DAYS_UNTIL_EXPIRY 天\\n\\n"
    MESSAGE+="請盡快更新憑證!"
    
    curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
        -d "chat_id=$ADMIN_CHAT_ID" \
        -d "text=$MESSAGE"
    
    echo "已發送 SSL 到期警告"
else
    echo "SSL 憑證狀態正常,還有 $DAYS_UNTIL_EXPIRY 天到期"
fi`}

3. 網站健康檢查

{`#!/bin/bash
# 網站健康檢查腳本

URLS=(
    "https://example.com"
    "https://api.example.com/health"
    "https://admin.example.com"
)

for URL in "${URLS[@]}"; do
    # 檢查 HTTP 狀態碼
    STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$URL")
    
    # 檢查回應時間
    RESPONSE_TIME=$(curl -s -o /dev/null -w "%{time_total}" "$URL")
    
    if [ "$STATUS" != "200" ]; then
        MESSAGE="🚨 網站異常警報\\n\\n"
        MESSAGE+="URL: $URL\\n"
        MESSAGE+="狀態碼: $STATUS\\n"
        MESSAGE+="時間: $(date '+%Y-%m-%d %H:%M:%S')\\n\\n"
        MESSAGE+="請立即檢查!"
        
        curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
            -d "chat_id=$ADMIN_CHAT_ID" \
            -d "text=$MESSAGE"
            
    elif (( $(echo "$RESPONSE_TIME > 5" | bc -l) )); then
        MESSAGE="⚠️ 網站回應緩慢\\n\\n"
        MESSAGE+="URL: $URL\\n"
        MESSAGE+="回應時間: ${RESPONSE_TIME}s\\n"
        MESSAGE+="建議檢查伺服器負載"
        
        curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
            -d "chat_id=$ADMIN_CHAT_ID" \
            -d "text=$MESSAGE"
    else
        echo "✅ $URL 正常 (狀態: $STATUS, 回應: ${RESPONSE_TIME}s)"
    fi
done`}

設定檔範例

完整自動化設定

{`# 自動化任務設定檔

schedules:
  # 每日備份
  daily_backup:
    type: cron
    schedule: "0 2 * * *"  # 每天凌晨 2 點
    script: "scripts/backup-db.sh"
    notify_on: [success, failure]
    
  # 健康檢查
  health_check:
    type: cron
    schedule: "*/30 * * * *"  # 每 30 分鐘
    script: "scripts/health-check.sh"
    notify_on: [failure]
    
  # SSL 檢查
  ssl_check:
    type: cron
    schedule: "0 9 * * 1"  # 每週一早上 9 點
    script: "scripts/check-ssl.sh"
    notify_on: [failure]
    
  # Heartbeat 系統檢查
  system_heartbeat:
    type: heartbeat
    interval: 30m
    checks:
      - disk_space
      - memory
      - services
    notify_on: [warning, critical]

notifications:
  telegram:
    bot_token: "${TELEGRAM_BOT_TOKEN}"
    chat_id: "${ADMIN_CHAT_ID}"
    
  email:
    smtp_server: "${SMTP_SERVER}"
    to: "${ADMIN_EMAIL}"

retention:
  logs: "30d"
  backups: "7d"
  reports: "90d"`}

任務執行日誌

{`[2026-03-21 02:00:00] INFO: 開始執行 daily_backup
[2026-03-21 02:00:15] INFO: 資料庫備份成功 (size: 150MB)
[2026-03-21 02:00:16] INFO: 已發送 Telegram 通知
[2026-03-21 02:00:16] INFO: daily_backup 完成

[2026-03-21 08:00:00] INFO: Heartbeat 檢查開始
[2026-03-21 08:00:01] INFO: Disk space: 45% (OK)
[2026-03-21 08:00:01] INFO: Memory: 62% (OK)
[2026-03-21 08:00:02] INFO: Nginx: running (OK)
[2026-03-21 08:00:02] INFO: Database: connected (OK)
[2026-03-21 08:00:02] INFO: Heartbeat 檢查完成

[2026-03-21 08:30:00] INFO: Heartbeat 檢查開始
[2026-03-21 08:30:01] WARN: Disk space: 82% (WARNING)
[2026-03-21 08:30:01] INFO: 已發送警告通知
[2026-03-21 08:30:02] INFO: Heartbeat 檢查完成`}

最佳實踐

1. 錯誤處理

  • 每個腳本都要有錯誤處理
  • 失敗時發送通知
  • 記錄詳細錯誤訊息

2. 日誌管理

  • 統一記錄到 logs 目錄
  • 定期清理舊日誌
  • 保留執行歷史

3. 通知策略

任務類型成功通知失敗通知
備份✅ 必須
健康檢查✅ 必須
報表生成
例行清理

4. 安全性

  • 敏感資訊使用環境變數
  • 腳本檔案權限設為 700
  • 定期檢查 Cron 任務

小結

排程與自動化讓重複任務不再需要人工干預:> > - Cron:定時執行,適合備份、報表、清理> - Heartbeat:狀態檢查,適合監控、健康檢查> - 錯誤通知:出問題立即知道,不遺漏任何異常> - 日誌記錄:完整執行歷史,方便追蹤問題