
# Linux 系統管理必學:用 systemd timer 取代 cron job 嘅完整指南
做咗咁多年 IT,cron job 幾乎係每個系統管理員嘅入門必修課。但你有冇諗過,喺 2026 年嘅今日,systemd timer 已經完全可以取代 cron,而且功能仲強大好多?今日就同大家拆解點樣由 cron 遷移到 systemd timer,等你可以更精準咁管理排程任務。
## 點解要轉用 systemd timer?
cron 好用,但佢有幾個先天缺陷。首先,cron 唔識得處理任務之間嘅依賴關係——如果你個 job 需要等 database 起好先可以行,cron 係唔會理嘅。其次,cron 冇內置嘅 logging 機制,debug 起上嚟要周圍搵 log。最重要嘅係,cron 唔支援精確到秒嘅排程,最少單位係分鐘。
systemd timer 就完全唔同。佢同 systemd service 深度整合,可以設定任務依賴、自動記錄 stdout/stderr 去 journald、支援 calendar event 格式(精確到秒),仲可以設定 randomized delay 避免多部機同時執行造成 spike。
## 由 Cron 到 Systemd Timer:實戰遷移
假設你有一個 backup script,而家係用 cron 每日凌晨 2 點執行:
# /etc/cron.d/backup
0 2 * * * root /usr/local/bin/backup.sh
要遷移到 systemd timer,你需要建立兩個檔案:一個 service unit 同一個 timer unit。
### Step 1:建立 Service Unit
sudo vim /etc/systemd/system/backup.service
[Unit]
Description=Daily System Backup
After=network.target postgresql.service
Wants=postgresql.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
User=root
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
留意 `After=postgresql.service` 呢行——呢個就係 cron 做唔到嘅任務依賴。你嘅 backup job 會等 PostgreSQL 起好先執行,唔會因為 database 未 ready 而失敗。
### Step 2:建立 Timer Unit
sudo vim /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer
Requires=backup.service
[Timer]
OnCalendar=daily
OnCalendar=*-*-* 02:00:00
RandomizedDelaySec=300
Persistent=true
[Install]
WantedBy=timers.target
`OnCalendar=daily` 係 systemd 嘅 shorthand,等於每日 00:00:00。加多行 `OnCalendar=*-*-* 02:00:00` 就精確設定到凌晨 2 點。`RandomizedDelaySec=300` 會隨機延遲最多 5 分鐘,避免多部機同時執行。`Persistent=true` 代表如果部機喺排程時間熄咗,開機後會補行返。
### Step 3:啟用同驗證
# 啟用 timer(唔需要 enable service)
sudo systemctl enable backup.timer
sudo systemctl start backup.timer
# 檢查 timer 狀態
systemctl list-timers --all | grep backup
# 手動觸發測試
sudo systemctl start backup.service
# 睇 log
journalctl -u backup.service -f
## systemd timer 進階技巧
### 精確到秒嘅排程
cron 最細單位係分鐘,但 systemd timer 支援秒級精度:
# 每 30 秒執行一次
OnUnitActiveSec=30s
# 每 90 分鐘執行一次
OnUnitActiveSec=90min
### Monotonic Timer vs Realtime Timer
systemd 有兩種 timer 類型。`OnCalendar` 係 realtime timer,跟牆鐘時間。`OnBootSec` 同 `OnUnitActiveSec` 係 monotonic timer,跟系統開機時間,唔受時區變更影響。
[Timer]
# 開機後 5 分鐘執行一次
OnBootSec=5min
# 之後每 1 小時執行
OnUnitActiveSec=1h
### 複雜排程:每個月第一個星期一
cron 要做到「每個月第一個星期一」要寫 `0 2 1-7 * 1`,好容易出錯。systemd timer 直接用 `OnCalendar=Mon *-*-1..7 02:00:00`,語意清晰好多。
## 遷移 Checklist
1. **Audit 現有 cron jobs**:`crontab -l` + `/etc/cron.*` 全部檢查一次
2. **逐個建立 service + timer unit**:每個 cron job 一對 unit files
3. **測試**:用 `systemctl start` 手動行一次確認冇問題
4. **啟用 timer**:`systemctl enable –now xxx.timer`
5. **停用舊 cron**:comment out 或移除舊 cron entry
6. **監控**:用 `journalctl` 同 `systemctl list-timers` 持續檢查
## 總結
systemd timer 唔單止可以取代 cron,仲帶嚟更好嘅依賴管理、logging 同排程靈活性。對於現代 Linux 系統管理嚟講,轉用 systemd timer 係一個值得投資嘅升級。你嘅 infrastructure 會因此而更可靠、更易維護。
🔗 參考資料:NVD NIST 漏洞資料庫
仲用緊 cron?係時候升級啦!



