Linux Crontab 設定排程任務
Crontab (Cron Table) 是 Linux 系統中用來設定「定期執行工作」的工具。 例如:每天凌晨 3 點備份資料庫、每 5 分鐘檢查一次網站狀態。
管理指令
編輯排程 (-e)
crontab -e
第一次執行會問你要用哪個編輯器(建議選 nano)。
列出排程 (-l)
crontab -l
刪除排程 (-r)
crontab -r
# 小心!這會刪光所有排程且不詢問。
Crontab 語法格式
每一行代表一個任務,格式如下:
* * * * * command_to_execute
這 5 個星星分別代表:
- 分鐘 (0 - 59)
- 小時 (0 - 23)
- 日期 (1 - 31)
- 月份 (1 - 12)
- 星期 (0 - 7) (0 和 7 都代表星期日)
常見範例
| 設定值 | 意義 |
|---|---|
* * * * * | 每分鐘執行一次 |
0 3 * * * | 每天凌晨 3:00 執行 |
0 0 * * 1 | 每週一的 0:00 執行 |
*/5 * * * * | 每「隔」 5 分鐘執行一次 |
0 9-18 * * * | 每天 9 點到 18 點的整點執行 |
設定環境變數與 Shell
在 Crontab 的最上方,你可以定義執行的環境變數。這非常重要,因為 Cron 執行時的環境變數通常只包含最基本的 /usr/bin:/bin。
# 指定使用的 Shell (預設是 /bin/sh,建議改為 bash)
SHELL=/bin/bash
# 指定 PATH,這樣寫指令就不用一直打絕對路徑
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 設定編碼 (避免中文亂碼)
LANG=zh_TW.UTF-8
# 你的排程任務...
* * * * * python3 /home/user/script.py
System Cron vs User Cron
Linux 的排程其實分為兩種體系,新手很容易搞混。
1. User Cron (使用者層級)
- 指令:
crontab -e - 位置:
/var/spool/cron/crontabs/<username> - 格式:
5 個星 + 指令(如上所述) - 權限:以該使用者的身份執行。
2. System Cron (系統層級)
- 位置:
/etc/crontab或/etc/cron.d/目錄下的檔案。 - 格式:6 個欄位!在時間與指令中間多了一個
user-name欄位。 - 用途:通常是系統管理員或安裝套件時使用。
System Cron 格式範例 (/etc/crontab):
# m h dom mon dow user command
0 4 * * * root /root/backup.sh
*/10 * * * * miko /home/miko/check.sh
(注意到了嗎?多了一個 user 欄位指定要用誰的身份跑)
3. 特殊目錄 (/etc/cron.*)
系統還有預設的幾個目錄,讓你不用寫 Crontab 語法也能設排程:
/etc/cron.daily/: 每天執行一次 (時間通常在/etc/crontab定義)/etc/cron.hourly/: 每小時執行一次/etc/cron.weekly/: 每週執行一次/etc/cron.monthly/: 每月執行一次
只要把 Shell Script 丟進去(記得 chmod +x),系統就會自動執行了。
實用技巧
1. 輸出重導向
Cron 執行時是在背景,你看不到輸出。如果程式報錯你會不知道。 通常我們會把輸出存到 Log 檔。
# 把 stdout 和 stderr 都寫入 log
*/5 * * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
2. 使用絕對路徑
這是新手最大的坑! Cron 的環境變數可能跟你的 Shell 不同(例如 PATH)。 所以在寫 Command 或 Script 路徑時,務必使用 絕對路徑。
- ⭕
/usr/bin/python3 /home/user/script.py - ❌
python3 script.py
3. 線上產生器
記不住星星的位置? 推薦使用線上工具如 Crontab.guru 來輔助設定。