核心概念
cron 是 Linux 守護進程,讀取 crontab(cron table)定時執行命令。每個用戶擁有獨立的 crontab,互不影響。
基本操作命令
| 命令 | 說明 |
crontab -e | 編輯當前用戶 crontab(首次會選擇編輯器,推薦 vim/nano) |
crontab -l | 列出當前用戶 crontab 內容 |
crontab -r | 刪除當前用戶 crontab(慎用!無確認提示) |
crontab -u user -e | 以 root 權限編輯指定用戶 crontab |
sudo service cron restart | 重啟 cron 服務(修改後通常自動生效,無需重啟) |
select-editor | 更換預設編輯器 |
crontab 語法詳解
# 格式:分 時 日 月 週 命令
# 範例:每天凌晨 2:30 備份資料庫
30 2 * * * /usr/bin/mysqldump -u root -p'pass' dbname > /backup/db_$(date +\%Y\%m\%d).sql
時間欄位取值範圍
| 欄位 | 範圍 | 特殊值 |
| 分 | 0-59 | * , - / |
| 時 | 0-23 | * , - / |
| 日 | 1-31 | * , - / ? L W |
| 月 | 1-12 | * , - / |
| 週 | 0-7 | * , - / # L (0 和 7 皆為週日) |
特殊符號用法
*:任意值(每分鐘/每小時/每天...)
,:列舉值,如 1,15,30 表示第 1、15、30 分鐘
-:範圍,如 9-18 表示 9 點到 18 點
/:步長,如 */5 表示每 5 分鐘,10-20/2 表示 10-20 每 2 分鐘
常見排程範例
| 需求 | crontab 寫法 |
| 每分鐘執行 | * * * * * command |
| 每小時第 0 分 | 0 * * * * command |
| 每天 02:30 | 30 2 * * * command |
| 每週一 03:00 | 0 3 * * 1 command |
| 每月 1 號 04:00 | 0 4 1 * * command |
| 工作日 09:00-18:00 每小時 | 0 9-18 * * 1-5 command |
| 每 10 分鐘 | */10 * * * * command |
| 每年 1 月 1 日 00:00 | 0 0 1 1 * command |
實戰範例:定時執行 PHP 腳本
# 方式 1:直接呼叫 PHP CLI(推薦)
# 每 10 分鐘同步一次資料
*/10 * * * * /usr/bin/php /var/www/html/cron/sync_data.php >> /var/log/sync_data.log 2>&1
# 方式 2:透過 HTTP 觸發(需安裝 curl/wget/lynx)
# 每小時觸發一次 API
0 * * * * /usr/bin/curl -s -o /dev/null "https://api.example.com/cron/trigger?token=secret"
# 方式 3:使用 wget 靜默模式
*/5 * * * * /usr/bin/wget -q -O /dev/null "https://localhost/cron/job.php"
環境變數與路徑陷阱(最常見失敗原因)
- PATH 不同: cron 環境 PATH 極少(通常只有
/usr/bin:/bin),所有命令必須用絕對路徑(/usr/bin/php、/usr/bin/curl、/usr/local/bin/node)。
- 工作目錄: 執行目錄為用戶家目錄,腳本內相對路徑會失效,請用
cd /path/to/project && /usr/bin/php script.php 或腳本內 chdir(__DIR__)。
- 環境變數: 無
HOME、LANG、PATH 等,需在 crontab 開頭宣告:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LANG=zh_TW.UTF-8
輸出與日誌管理
# 1. 導向日誌檔(推薦)
* * * * * /usr/bin/php /path/script.php >> /var/log/script.log 2>&1
# 2. 僅記錄錯誤
* * * * * /usr/bin/php /path/script.php 2>> /var/log/script_error.log
# 3. 完全靜默(不產生任何輸出郵件/日誌)
* * * * * /usr/bin/php /path/script.php > /dev/null 2>&1
# 4. 系統郵件通知(預設行為,需配置 postfix/sendmail)
# 只要不重導向輸出,標準輸出/錯誤會郵件寄給用戶
權限與安全
- 腳本檔案需有執行權限:
chmod +x script.php 或用 php script.php 執行。
- 敏感操作(備份、清理)請用專用低權限用戶,避免用 root。
/etc/cron.allow / /etc/cron.deny 控制用戶是否可用 crontab(若允許檔存在,僅名單內用戶可用)。
系統級排程:/etc/cron.d/
套件安裝的排程建議放在 /etc/cron.d/ 而非用戶 crontab,格式多一個 用戶欄位:
# /etc/cron.d/myapp
# 分 時 日 月 週 用戶 命令
30 2 * * * www-data /usr/bin/php /var/www/html/cron/cleanup.php
除錯技巧
- 檢查 cron 是否運行:
systemctl status cron 或 ps aux | grep cron
- 查看執行日誌:
grep CRON /var/log/syslog (Ubuntu/Debian) 或 /var/log/cron (CentOS/RHEL)
- 手動測試命令: 先在終端機用相同用戶身份執行
sudo -u www-data /usr/bin/php /path/script.php 確認無誤。
- 測試語法:
crontab -l | crontab - 會驗證語法(錯誤會報告)。