Cron 是 Linux 系統級定時任務調度服務,支援分鐘級精度,廣泛用於備份、日誌輪轉、腳本自動化等場景。本文涵蓋服務控制、crontab 語法、系統級配置與最佳實踐。
# 啟動/停止/重啟/重載
systemctl start|stop|restart|reload crond # systemd 系統
service crond start|stop|restart|reload # SysVinit 兼容
# 開機自啟
systemctl enable crond
# 或傳統方式
echo "/sbin/service crond start" >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
crontab -u USER -e # 編輯指定用戶任務(root 需 -u)
crontab -u USER -l # 列出任務
crontab -u USER -r # 刪除所有任務
編輯時進入 vi,每行一條任務,格式:
* * * * * command-to-execute
- - - - -
| | | └─ 星期 (0-7) (0/7=週日)
| | └──── 月份 (1-12)
| └────── 日期 (1-31)
└──────── 小時 (0-23)
└──────── 分鐘 (0-59)
| 符號 | 含義 | 範例 |
|---|---|---|
* | 所有取值 | * * * * * 每分鐘執行 |
*/n | 每 n 個單位 | */5 * * * * 每 5 分鐘 |
a-b | 範圍 | 8-18 * * * 8~18 點每小時 |
a,b,c | 離散列表 | 1,15,30 * * * * 每小時第 1/15/30 分 |
實用範例:
# 每天 6:00 問候
0 6 * * * echo "Good morning." >> /tmp/test.txt
# 每 2 小時提醒休息
0 */2 * * * echo "Have a break." >> /tmp/test.txt
# 23:00~07:00 每 2 小時 + 08:00
0 23-7/2,8 * * * echo "Good dream." >> /tmp/test.txt
# 每月 4 號 & 每週一至三 11:00
0 11 4 * 1-3 /path/to/script.sh
# 1 月 1 日 04:00
0 4 1 1 * /path/to/yearly.sh
/etc/crontab 格式多一個 USER 欄位,適用於系統維護任務:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# 由 run-parts 執行目錄下所有腳本
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
自定義系統任務建議放入 /etc/cron.d/ 目錄(每文件一任務),便於包管理與版本控制。
>/dev/null 2>&1 或導向日誌文件。PATH、HOME 等),腳本內使用絕對路徑,或在 crontab 開頭定義 PATH。chmod +x,shebang 指定解釋器(#!/bin/bash)。flock 或 run-one 防止任務重疊執行。journalctl -u crond 或 /var/log/cron 查看執行記錄。