首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Ubuntu crontab 定時任務完整配置指南:編寫、管理與常見坑點

     編輯:PHP 綜合知識

核心概念

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:3030 2 * * * command
每週一 03:000 3 * * 1 command
每月 1 號 04:000 4 1 * * command
工作日 09:00-18:00 每小時0 9-18 * * 1-5 command
每 10 分鐘*/10 * * * * command
每年 1 月 1 日 00:000 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"

環境變數與路徑陷阱(最常見失敗原因)

  1. PATH 不同: cron 環境 PATH 極少(通常只有 /usr/bin:/bin),所有命令必須用絕對路徑(/usr/bin/php、/usr/bin/curl、/usr/local/bin/node)。
  2. 工作目錄: 執行目錄為用戶家目錄,腳本內相對路徑會失效,請用 cd /path/to/project && /usr/bin/php script.php 或腳本內 chdir(__DIR__)。
  3. 環境變數: 無 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

除錯技巧

  1. 檢查 cron 是否運行: systemctl status cron 或 ps aux | grep cron
  2. 查看執行日誌: grep CRON /var/log/syslog (Ubuntu/Debian) 或 /var/log/cron (CentOS/RHEL)
  3. 手動測試命令: 先在終端機用相同用戶身份執行 sudo -u www-data /usr/bin/php /path/script.php 確認無誤。
  4. 測試語法: crontab -l | crontab - 會驗證語法(錯誤會報告)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved