⏰ 排程與自動化
重複性的任務應該交給機器。透過 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
| 特性 | Cron | Heartbeat |
|---|---|---|
| 執行方式 | 固定時間強制執行 | 檢查狀態後決定是否行動 |
| 適合場景 | 備份、報表發送 | 監控、健康檢查 |
| 靈活性 | 時間固定 | 可根據狀態調整 |
| 資源消耗 | 固定 | 有問題時才消耗 |
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:狀態檢查,適合監控、健康檢查> - 錯誤通知:出問題立即知道,不遺漏任何異常> - 日誌記錄:完整執行歷史,方便追蹤問題