萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux Crontab 定時任務完整指南:從語法到實戰應用

在 Linux 系統維護中,自動化執行例行性工作(如備份、日誌輪轉、服務重啟、腳本巡檢)是提升效率的關鍵。cron 守護進程與 crontab 配置工具正是實現此需求的核心組件。本文將深入淺出地講解 Crontab 的時間表達式語法、常用操作指令、輸出重導向技巧,並提供實戰範例助你快速部署自動化任務。

Crontab 定時任務示意圖

什麼是 Crontab?

cron 是一個常駐後台的守護進程,每分鐘檢查一次系統與用戶的定時任務表,時間匹配時自動執行對應命令。crontab (Cron Table) 則是用於編輯、查看、刪除這些任務表的命令列工具。每個用戶擁有獨立的 crontab 檔案(存放於 /var/spool/cron/用戶名),root 用戶亦可編輯系統級任務 (/etc/crontab、/etc/cron.d/)。

Crontab 時間表達式詳解

標準格式:分 時 日 月 週 命令

# ┌───────────── 分鐘 (0 - 59)
# │ ┌───────────── 小時 (0 - 23)
# │ │ ┌───────────── 日期 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12) 或 jan,feb,mar...
# │ │ │ │ ┌───────────── 週幾 (0 - 6) (Sunday=0 或 7) 或 sun,mon,tue...
# │ │ │ │ │
# * * * * *  要執行的命令

特殊符號與進階用法

符號含義範例說明
*任意值* * * * *每分鐘執行一次
,列舉值0 9,18 * * *每天 09:00 和 18:00 執行
-範圍值0 9-18 * * 1-5週一至週五,每小時整點執行
/步長/間隔*/10 * * * *每 10 分鐘執行一次

輸出重導向與錯誤處理

定時任務在後台無終端執行,標準輸出與錯誤輸出預設會寄送郵件給任務擁有者。建議在命令中顯式處理:

# 僅保留錯誤日誌
0 2 * * * /backup.sh >> /var/log/backup.log 2>&1

# 完全靜默 (丟棄所有輸出)
0 3 * * * /cleanup.sh > /dev/null 2>&1

# 區分標準輸出與錯誤輸出到不同檔案
0 4 * * * /script.sh > /var/log/script.out 2> /var/log/script.err

解析: 1 代表 stdout,2 代表 stderr,& 表示「等同於」,2>&1 即將 stderr 重導向至 stdout 所指向的位置。

常用操作指令

  • crontab -e:編輯當前用戶的 crontab (會啟動編輯器,預設 vi/nano)。
  • crontab -l:列出當前用戶的任務清單。
  • crontab -r:刪除當前用戶所有任務 (慎用,無確認提示)。
  • crontab -u user -e:root 編輯指定用戶的任務。

實戰範例集錦

# 範例 1:每天凌晨 3:30 備份資料庫並記錄日誌
30 3 * * * /usr/bin/mysqldump -u root -p'password' dbname > /backup/db_$(date +\%Y\%m\%d).sql 2>> /var/log/db_backup.log

# 範例 2:每週一至週五中午 12:00 重啟 Web 服務
0 12 * * 1-5 systemctl restart nginx php-fpm

# 範例 3:每月 1 號 00:00 清理 30 天前的舊日誌
0 0 1 * * find /var/log/app -name "*.log" -mtime +30 -delete

# 範例 4:每 5 分鐘檢查服務狀態,異常則重啟 (需腳本支援)
*/5 * * * * /usr/local/bin/check_service.sh || systemctl restart myservice

# 範例 5:系統啟動時自動執行 (需配合 @reboot)
@reboot /opt/startup_script.sh

系統級 Crontab (/etc/crontab) 差異

/etc/crontab 格式多一個 用戶欄位,且通常由套件安裝腳本管理:

# 格式:分 時 日 月 週 用戶 命令
25 6 * * * root test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily

建議:個人任務用 crontab -e,系統服務任務放入 /etc/cron.d/ 目錄下獨立檔案。

常見坑與除錯技巧

  1. 環境變數缺失: cron 執行環境極簡 (無 PATH、HOME 等)。解決:命令使用絕對路徑;或在 crontab 開頭定義 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin。
  2. 百分號 % 轉義: crontab 中 % 代表換行。解決:在命令中寫 \% (如 date +\%Y\%m\%d)。
  3. 腳本無執行權限: 解決:chmod +x script.sh。
  4. 相對路徑問題: 解決:腳本內 cd /absolute/path 或使用絕對路徑。
  5. 查看執行日誌: grep CRON /var/log/syslog (Debian/Ubuntu) 或 /var/log/cron (CentOS/RHEL)。

總結

熟練掌握 Crontab 的時間表達式、重導向技巧與環境變數陷阱,能讓你輕鬆構建穩健的 Linux 自動化運維體系。建議將複雜邏輯封裝為獨立 Shell/Python 腳本,crontab 僅負責調度觸發,實現關注點分離。

copyright © 萬盛學電腦網 all rights reserved