Cron 表達式完全教學
什麼是 Cron?
Cron 是 Unix/Linux 系統中的定時任務排程器,使用 Cron 表達式來定義任務的執行時間。Cron 表達式是一種簡潔但強大的時間描述格式。
Cron 表達式格式
標準 Cron 表達式由 5 個欄位組成:
┌───────────── 分鐘 (0-59)
│ ┌───────────── 小時 (0-23)
│ │ ┌───────────── 日期 (1-31)
│ │ │ ┌───────────── 月份 (1-12)
│ │ │ │ ┌───────────── 星期 (0-6, 0=週日)
│ │ │ │ │
* * * * *
┌───────────── 分鐘 (0-59)
│ ┌───────────── 小時 (0-23)
│ │ ┌───────────── 日期 (1-31)
│ │ │ ┌───────────── 月份 (1-12)
│ │ │ │ ┌───────────── 星期 (0-6, 0=週日)
│ │ │ │ │
* * * * *
特殊字元
| 字元 | 說明 | 範例 |
|---|---|---|
* | 任意值 | * * * * * 每分鐘 |
, | 列舉多個值 | 1,15 * * * * 第 1 和 15 分鐘 |
- | 範圍 | 1-5 * * * * 第 1 到 5 分鐘 |
/ | 步進值 | */15 * * * * 每 15 分鐘 |
常用 Cron 範例
基礎範例
| 表達式 | 說明 |
|---|---|
0 * * * * | 每小時整點 |
0 0 * * * | 每天午夜 |
0 9 * * 1-5 | 週一到週五早上 9 點 |
0 0 1 * * | 每月 1 號午夜 |
0 0 1 1 * | 每年 1 月 1 日午夜 |
進階範例
| 表達式 | 說明 |
|---|---|
*/5 * * * * | 每 5 分鐘 |
0 */2 * * * | 每 2 小時 |
0 9,18 * * * | 每天 9 點和 18 點 |
0 0 * * 0 | 每週日午夜 |
30 4 1,15 * * | 每月 1 號和 15 號凌晨 4:30 |
實際應用場景
1. 資料庫備份
bash
# 每天凌晨 2 點備份
0 2 * * * /scripts/backup-db.sh
# 每天凌晨 2 點備份
0 2 * * * /scripts/backup-db.sh
2. 日誌清理
bash
# 每週日凌晨 3 點清理 30 天前的日誌
0 3 * * 0 find /var/log -mtime +30 -delete
# 每週日凌晨 3 點清理 30 天前的日誌
0 3 * * 0 find /var/log -mtime +30 -delete
3. 健康檢查
bash
# 每 5 分鐘檢查服務狀態
*/5 * * * * /scripts/health-check.sh
# 每 5 分鐘檢查服務狀態
*/5 * * * * /scripts/health-check.sh
4. 報表生成
bash
# 每月 1 號早上 8 點生成月報
0 8 1 * * /scripts/generate-report.sh
# 每月 1 號早上 8 點生成月報
0 8 1 * * /scripts/generate-report.sh
最佳實踐
- 避免在整點執行:很多任務都設定在整點,可能造成系統負載集中
- 加入隨機延遲:在分散式系統中,避免所有節點同時執行
- 設定超時機制:防止任務卡住影響下次執行
- 記錄執行日誌:方便追蹤和除錯
- 使用絕對路徑:Cron 環境的 PATH 可能與互動式 Shell 不同
常見錯誤
忘記時區設定
Cron 預設使用系統時區,在不同環境中可能不一致。建議在 crontab 中明確設定:
bash
CRON_TZ=Asia/Taipei
0 9 * * * /scripts/task.sh
CRON_TZ=Asia/Taipei
0 9 * * * /scripts/task.sh
忽略輸出重導向
Cron 任務的輸出預設會發送郵件,建議重導向到日誌檔:
bash
0 * * * * /scripts/task.sh >> /var/log/task.log 2>&1
0 * * * * /scripts/task.sh >> /var/log/task.log 2>&1
實用工具推薦
使用我們的 Cron 表達式產生器 [blocked] 可以可視化設定 Cron 排程,即時預覽下次執行時間,還有常用範本可以快速套用。



