Crontab 是 Linux 系統排程任務的核心工具,支援分鐘級精度的週期性命令執行。本文系統講解 Crontab 語法、編輯操作、服務管理、實戰範例與常見坑點,助你精準掌控自動化任務。
/var/spool/cron/)。cron 守護進程每分鐘掃描一次,匹配時間條件則執行對應命令。/etc/crontab 與 /etc/cron.d/,格式略有不同(多一個使用者欄位)。| 命令 | 功能 |
|---|---|
crontab -e | 編輯當前使用者定時任務(建立專屬編輯器環境) |
crontab -l | 列出當前使用者定時任務 |
crontab -r | 刪除當前使用者所有定時任務(慎用) |
crontab -u user -e | root 編輯指定使用者任務 |
* * * * * 執行命令
- - - - -
| | | | └─ 星期幾 (0-7) (0或7=星期日)
| | | └──── 月份 (1-12)
| | └────── 日期 (1-31)
| └──────── 小時 (0-23)
└────────── 分鐘 (0-59)
*:任意值,:列舉值(如 1,15 表示 1 號和 15 號)-:範圍(如 1-5 表示 1 到 5)/:步長(如 */10 表示每 10 分鐘,2-10/2 表示 2-10 每 2)| 需求 | Crontab 條目 | 說明 |
|---|---|---|
| 每分鐘執行 | * * * * * /path/to/script.sh | 測試用,生產慎用 |
| 每小時第 5 分鐘 | 5 * * * * /path/to/script.sh | |
| 每天 02:30 備份 | 30 2 * * * /backup.sh >> /var/log/backup.log 2>&1 | 重導向輸出到日誌 |
| 工作日 09:00 發報表 | 0 9 * * 1-5 /report.sh | 1-5 為週一至週五 |
| 每月 1 號 00:00 清理日誌 | 0 0 1 * * /cleanup.sh | |
| 每 10 分鐘檢查服務 | */10 * * * * /check_service.sh | 高頻監控 |
| 每年 12/31 23:59 年終處理 | 59 23 31 12 * /year_end.sh |
/root/scripts/backup.sh),避免 PATH 環境變數差異導致找不到命令。#!/bin/bash 指定解釋器。chmod +x /path/to/script.sh。source /etc/profile 或 source ~/.bashrc 確保環境一致。> /var/log/mylog.log 2>&1 捕獲標準輸出與錯誤,防止郵件堆積。flock 或 PID 檔防止並發執行。# 檢查狀態
systemctl status cron # systemd 系統
service cron status # SysVinit 系統
# 重啟服務(修改 crontab 後通常無需重啟,cron 會自動重讀)
systemctl restart cron
| 現象 | 原因 | 解決 |
|---|---|---|
| 任務不執行 | 命令路徑錯誤/無執行權限/環境變數缺失 | 用絕對路徑、加 Shebang、source profile |
| 執行時間不準 | 系統時間/時區錯誤 | timedatectl set-timezone Asia/Taipei |
| 日誌無輸出 | 重導向語法錯誤/權限不足 | > /path/log 2>&1、確認目錄可寫 |
| 重複執行 | 腳本執行時間超過間隔/無鎖機制 | 加 flock -n /tmp/mylock -c "cmd" |
| 特殊字元失效 | % 在 crontab 有特殊含義(換行) | 用 \% 轉義或寫入腳本檔 |
# /etc/crontab: 多一個 USER 欄位
* * * * * root /usr/local/bin/system_task.sh
此外 /etc/cron.d/ 目錄下每個檔案同此格式,便於套件管理與版本控制。
現代系統(systemd)推薦使用 .timer + .service 替代 Crontab,優勢:
RandomizedDelaySec)。journalctl -u myservice)。systemctl list-timers 統一查看。熟練掌握 Crontab 並了解 systemd Timers,即可構建健壯、可維運的 Linux 自動化任務體系。