Linux crontab 系統排程

系統排程簡介

cron 是 Linux/Unix 系統中用來設定排程工作的工具,可以定期執行腳本或指令。排程分為:

  • 使用者排程:由各自使用者設定自己的排程工作。
  • 系統排程:設定在 /etc/crontab 或其他自動載入的檔案中,通常由 root 或管理員設定。

crontab 指令

# 列出目前使用者的排程工作
crontab -l

# 編輯目前使用者的排程工作
crontab -e

系統排程範例

# 查看系統排程
sudo cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 分 時 日 月 星期 使用者 指令
0    2  1  *   *     root    /opt/bin/system-check
0    0  29 2   *     root    /opt/bin/system-check
30   2  *  *   6,7   sysop   /opt/bin/full-backup

欄位說明:

欄位 意義
分(Minute) 0 - 59
時(Hour) 0 - 23
日(Day of Month) 1 - 31
月(Month) 1 - 12 或 jan,feb,
星期(Day of Week) 0 - 7(0 和 7 都代表星期日),或 sun,mon,
使用者(User) 系統排程才需要,代表以哪個身份執行指令
指令(Command) 欲執行的指令或腳本

範例說明:

  • 每月 1 號 02:00,以 root 身份執行 /opt/bin/system-check
  • 每年 2 月 29 號 00:00,以 root 身份執行 /opt/bin/system-check
  • 每週六日(6, 7)02:30,以 sysop 身份執行 /opt/bin/full-backup

特殊符號:

  • /:間隔執行,例如 */3 * * * * 表示每 3 分鐘執行一次
  • ,:列舉多個值,例如 6,7 表示星期六與星期日
  • -:範圍,例如 1-5 表示星期一到星期五
  • *:通配任意值

使用者排程與系統排程的差異

項目 使用者排程 系統排程
檔案位置 crontab -e 編輯的個人排程(儲存於 /var/spool/cron/ /etc/crontab/etc/cron.d/
欄位數 5 個(無使用者欄位) 6 個(包含使用者欄位)
權限限制 僅能編輯自己的排程 需有 sudo 權限可編輯系統排程

排程記錄

排程工作無論成功或失敗都會被記錄到系統日誌中,可透過以下指令檢查:

# 查看 cron 執行紀錄(依發行版而異)
sudo tail /var/log/cron           # CentOS/RHEL
sudo tail /var/log/syslog | grep CRON   # Ubuntu/Debian

系統時間與排程不同步的處理方式

若排程執行時間與預期不符,可能為時區設定問題,處理步驟如下:

# 變更時區(以台灣為例)
sudo timedatectl set-timezone Asia/Taipei

# 重新啟動 cron 服務
sudo systemctl restart cron

若問題仍未解決,可重新啟動 rsyslog 服務來確保 log 正常記錄:

sudo systemctl restart rsyslog

確認是否已正確記錄排程執行:

sudo tail /var/log/syslog | grep CRON