Linux Crontab 設定排程任務

Crontab (Cron Table) 是 Linux 系統中用來設定「定期執行工作」的工具。 例如:每天凌晨 3 點備份資料庫、每 5 分鐘檢查一次網站狀態。

管理指令

編輯排程 (-e)

crontab -e

第一次執行會問你要用哪個編輯器(建議選 nano)。

列出排程 (-l)

crontab -l

刪除排程 (-r)

crontab -r
# 小心!這會刪光所有排程且不詢問。

Crontab 語法格式

每一行代表一個任務,格式如下:

* * * * * command_to_execute

這 5 個星星分別代表:

  1. 分鐘 (0 - 59)
  2. 小時 (0 - 23)
  3. 日期 (1 - 31)
  4. 月份 (1 - 12)
  5. 星期 (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 來輔助設定。