🐧 Linux Crontab 與系統排程完整教學:cron / systemd-timer 實務指南
Linux 的排程系統是所有伺服器管理、備份、自動化流程的重要基礎。 本篇將完整介紹 crontab、cron daemon、systemd timer,並提供實務範例, 協助你規劃從每日備份、服務健康檢查,到自動清理 log 等各種任務。
📌 一、Cron 與 Crontab 概念總覽
Cron 是 Linux 內建的排程系統,負責定期執行任務;而 Crontab 則是使用者可編輯的排程表。
cron:常駐服務,負責讀取排程。crontab:排程設定所在。- 位置包含:
/etc/crontab/etc/cron.d/、/etc/cron.hourly/等crontab -e(使用者排程)
📝 二、Crontab 格式說明(5 欄與 6 欄)
標準 Crontab 使用 5 欄格式:
# 分 時 日 月 星期
* * * * * 指令
| 欄位 | 範例 | 說明 |
|---|---|---|
| 分 | 0–59 | 第幾分鐘執行 |
| 時 | 0–23 | 24 小時制 |
| 日 | 1–31 | 一個月中的第幾天 |
| 月 | 1–12 | 月份 |
| 星期 | 0–7 | 0/7=星期日 |
✔ 常用符號
* 代表所有可能值
, 多個值,例如 1,3,5
- 範圍,如 1-5
/ 每隔,例如 */10 = 每 10 分鐘
📘 三、Crontab 實務範例
1️⃣ 每天 02:00 自動備份資料
0 2 * * * /usr/local/bin/backup.sh
2️⃣ 每 10 分鐘執行健康檢查
*/10 * * * * /usr/bin/systemctl is-active nginx >> /var/log/nginx_health.log
3️⃣ 每週一凌晨清除 7 天前的日誌
0 3 * * 1 find /var/log -type f -mtime +7 -delete
📌 查看 Cron 執行結果
journalctl -u cron
# 或
grep CRON /var/log/syslog
🧩 四、Systemd Timer:更現代、更穩定的排程方式
在 modern Linux (CentOS 7+、RHEL、Ubuntu 18.04+) 中,更建議使用 systemd timer, 因為它具備更完善的 Log、依賴性、啟動控制與觸發模型。
🔥 五、建立 Systemd Service + Timer(完整範例)
1️⃣ 建立 Service
# /etc/systemd/system/cleanup.service
[Unit]
Description=Cleanup old logs
[Service]
Type=oneshot
ExecStart=/usr/local/bin/cleanup.sh
2️⃣ 建立 Timer
# /etc/systemd/system/cleanup.timer
[Unit]
Description=Run cleanup job daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
3️⃣ 啟用排程
systemctl daemon-reload
systemctl enable --now cleanup.timer
systemctl status cleanup.timer
📌 查看執行紀錄(比 cron 更完整)
journalctl -u cleanup.service
systemctl list-timers
⚖️ 六、Cron vs Systemd Timer 比較
| 項目 | Cron | Systemd Timer |
|---|---|---|
| Log | 需查 syslog | journalctl 支援完善 |
| 穩定度 | 基本 | 強,可設定依賴、重啟策略 |
| 複雜任務 | 較難管理 | 適合大型任務 |
| 系統整合 | 低 | 高(完全 systemd 整合) |
建議:新系統優先用 systemd timer。
🔧 七、常見排查問題
1️⃣ Cron 沒有執行?
systemctl status cron
crontab -l
grep CRON /var/log/syslog
2️⃣ 指令不能執行?多半是 PATH 問題
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
# 建議寫在 crontab 文件開頭
3️⃣ systemd timer 未觸發?
systemctl status yourjob.timer
systemctl list-timers
journalctl -u yourjob.service
📘 結語
不論是 Cron 還是 Systemd Timer 都是 Linux 自動化的核心能力。 Cron 適合簡單、快速的任務;Systemd Timer 則適合更現代、可控、可觀察的大型排程。 建議在新環境全面導入 systemd timer,以提升可維護性與穩定度。
🔗 延伸閱讀
— WWFandy・系統自動化筆記
沒有留言: