
# Linux 系統管理必學:用 systemd timer 取代 cron job
做 IT 嘅你一定用過 cron job,但你有冇諗過,其實 systemd 已經有內置嘅 timer 功能,可以完全取代 cron?今日就同大家分享點樣用 systemd timer 嚟管理定時任務,仲有完整嘅 CLI 示範添!
## 點解要用 systemd timer 而唔係 cron?
cron 用咗幾十年,的確簡單直接。但 systemd timer 有幾個明顯優勢:
– **精確到秒**:cron 最細單位係分鐘,systemd timer 可以精確到秒甚至微秒
– **自動 logging**:所有 output 自動記錄喺 journald,唔使自己 redirect 去 log file
– **依賴管理**:可以設定 timer 要等某個 service 啟動咗先執行
– **隨機延遲**:內置 RandomizedDelaySec,避免多部機同時執行造成 spike
– **斷電補償**:Persistent=true 可以喺系統 missed 咗執行時間後自動補跑
## 實戰:建立一個 systemd timer
假設你想每 30 分鐘自動 backup 一個 database。傳統 cron 寫法係:
*/30 * * * * /usr/local/bin/backup-db.sh
用 systemd timer 就要建立兩個檔案:一個 service unit 同一個 timer unit。
### Step 1:建立 service unit
sudo nano /etc/systemd/system/db-backup.service
內容:
[Unit]
Description=Database Backup Service
After=network.target postgresql.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup-db.sh
User=backup
Group=backup
StandardOutput=journal
StandardError=journal
### Step 2:建立 timer unit
sudo nano /etc/systemd/system/db-backup.timer
內容:
[Unit]
Description=Run database backup every 30 minutes
Requires=db-backup.service
[Timer]
OnCalendar=*:0/30
RandomizedDelaySec=60
Persistent=true
[Install]
WantedBy=timers.target
### Step 3:啟用同管理
# 啟用 timer(開機自動啟動)
sudo systemctl enable db-backup.timer
# 即刻啟動 timer
sudo systemctl start db-backup.timer
# 檢查 timer 狀態
sudo systemctl status db-backup.timer
# 列出所有 active timer
systemctl list-timers --all
# 睇下次執行時間
systemctl list-timers db-backup.timer
# 手動觸發一次(唔影響 schedule)
sudo systemctl start db-backup.service
## systemd timer 常用時間格式
`OnCalendar` 支援好多靈活格式:
# 每日凌晨 3 點
OnCalendar=daily
# 等同:OnCalendar=*-*-* 03:00:00
# 每小時
OnCalendar=hourly
# 每星期一 9:00
OnCalendar=Mon *-*-* 09:00:00
# 每月 1 號同 15 號
OnCalendar=*-*-01,15 02:00:00
# 每 10 分鐘
OnCalendar=*:0/10
# 工作日 8:00-18:00 每 2 小時
OnCalendar=Mon..Fri *-*-* 08..18:00:00
## 進階技巧:Monotonic Timer
除咗 wall-clock timer(OnCalendar),systemd 仲有 monotonic timer,由系統 boot 起計時:
[Timer]
# 系統 boot 後 5 分鐘執行一次
OnBootSec=5min
# 每次執行完後 30 分鐘再執行
OnUnitActiveSec=30min
呢個對於要確保 service 完全啟動後先執行嘅任務特別有用。
## 除錯技巧
如果 timer 唔 work,可以用以下方法 debug:
# 檢查 timer 係咪 active
systemctl is-active db-backup.timer
# 睇 timer 嘅完整 log
journalctl -u db-backup.timer -f
# 睇 service 執行 log
journalctl -u db-backup.service --since "1 hour ago"
# 檢查 timer 嘅下次觸發時間詳情
systemctl show db-backup.timer | grep -i next
# 驗證 unit file 語法
systemd-analyze verify /etc/systemd/system/db-backup.timer
## 總結
systemd timer 功能強大過 cron 好多,尤其喺現代 Linux 發行版(Ubuntu 16.04+、CentOS 7+、Debian 8+)都已經內置。如果你仲用緊 cron,不妨試下 migrate 去 systemd timer,管理同監控都會方便好多。
🔗 參考資料:NVD NIST 漏洞資料庫
下次再同大家分享更多 Linux 實戰技巧!



