Linux 系統管理必學:用 systemd timer 取代 cron job 完整教學

# Linux 系統管理必學:用 systemd timer 取代 cron job 做 IT 嘅你一定用過 cron job,但你有冇諗過,其實 systemd 已經有內置嘅 timer 功能,可以完全取代 cron?今日就同大家分享點樣用 systemd timer 嚟管理定時任務,仲有完整嘅 CLI 示範添! ## 點解要用 systemd timer 而唔係 cron? cron 用咗幾十...

Linux 系統管理必學:用 systemd timer 取代 cron job 完整教學 - 文章重點速覽 infographic

# 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 實戰技巧!