在 Linux 系統維護中,自動化執行例行性工作(如備份、日誌輪轉、服務重啟、腳本巡檢)是提升效率的關鍵。cron 守護進程與 crontab 配置工具正是實現此需求的核心組件。本文將深入淺出地講解 Crontab 的時間表達式語法、常用操作指令、輸出重導向技巧,並提供實戰範例助你快速部署自動化任務。

cron 是一個常駐後台的守護進程,每分鐘檢查一次系統與用戶的定時任務表,時間匹配時自動執行對應命令。crontab (Cron Table) 則是用於編輯、查看、刪除這些任務表的命令列工具。每個用戶擁有獨立的 crontab 檔案(存放於 /var/spool/cron/用戶名),root 用戶亦可編輯系統級任務 (/etc/crontab、/etc/cron.d/)。
標準格式:分 時 日 月 週 命令
# ┌───────────── 分鐘 (0 - 59)
# │ ┌───────────── 小時 (0 - 23)
# │ │ ┌───────────── 日期 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12) 或 jan,feb,mar...
# │ │ │ │ ┌───────────── 週幾 (0 - 6) (Sunday=0 或 7) 或 sun,mon,tue...
# │ │ │ │ │
# * * * * * 要執行的命令
| 符號 | 含義 | 範例 | 說明 |
|---|---|---|---|
* | 任意值 | * * * * * | 每分鐘執行一次 |
, | 列舉值 | 0 9,18 * * * | 每天 09:00 和 18:00 執行 |
- | 範圍值 | 0 9-18 * * 1-5 | 週一至週五,每小時整點執行 |
/ | 步長/間隔 | */10 * * * * | 每 10 分鐘執行一次 |
定時任務在後台無終端執行,標準輸出與錯誤輸出預設會寄送郵件給任務擁有者。建議在命令中顯式處理:
# 僅保留錯誤日誌
0 2 * * * /backup.sh >> /var/log/backup.log 2>&1
# 完全靜默 (丟棄所有輸出)
0 3 * * * /cleanup.sh > /dev/null 2>&1
# 區分標準輸出與錯誤輸出到不同檔案
0 4 * * * /script.sh > /var/log/script.out 2> /var/log/script.err
解析: 1 代表 stdout,2 代表 stderr,& 表示「等同於」,2>&1 即將 stderr 重導向至 stdout 所指向的位置。
crontab -e:編輯當前用戶的 crontab (會啟動編輯器,預設 vi/nano)。crontab -l:列出當前用戶的任務清單。crontab -r:刪除當前用戶所有任務 (慎用,無確認提示)。crontab -u user -e:root 編輯指定用戶的任務。# 範例 1:每天凌晨 3:30 備份資料庫並記錄日誌
30 3 * * * /usr/bin/mysqldump -u root -p'password' dbname > /backup/db_$(date +\%Y\%m\%d).sql 2>> /var/log/db_backup.log
# 範例 2:每週一至週五中午 12:00 重啟 Web 服務
0 12 * * 1-5 systemctl restart nginx php-fpm
# 範例 3:每月 1 號 00:00 清理 30 天前的舊日誌
0 0 1 * * find /var/log/app -name "*.log" -mtime +30 -delete
# 範例 4:每 5 分鐘檢查服務狀態,異常則重啟 (需腳本支援)
*/5 * * * * /usr/local/bin/check_service.sh || systemctl restart myservice
# 範例 5:系統啟動時自動執行 (需配合 @reboot)
@reboot /opt/startup_script.sh
/etc/crontab 格式多一個 用戶欄位,且通常由套件安裝腳本管理:
# 格式:分 時 日 月 週 用戶 命令
25 6 * * * root test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily
建議:個人任務用 crontab -e,系統服務任務放入 /etc/cron.d/ 目錄下獨立檔案。
PATH、HOME 等)。解決:命令使用絕對路徑;或在 crontab 開頭定義 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin。% 轉義: crontab 中 % 代表換行。解決:在命令中寫 \% (如 date +\%Y\%m\%d)。chmod +x script.sh。cd /absolute/path 或使用絕對路徑。grep CRON /var/log/syslog (Debian/Ubuntu) 或 /var/log/cron (CentOS/RHEL)。熟練掌握 Crontab 的時間表達式、重導向技巧與環境變數陷阱,能讓你輕鬆構建穩健的 Linux 自動化運維體系。建議將複雜邏輯封裝為獨立 Shell/Python 腳本,crontab 僅負責調度觸發,實現關注點分離。