Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux crond 定時任務完整指南:crontab 語法、環境變數坑、日誌靜默、系統級 vs 用戶級

編輯:關於 Linux

crond 是 Linux 系統級排程服務,支援分鐘級精度的週期性任務自動執行。本文系統整理 crontab 寫法、六欄位時間語法、特殊符號、環境變數陷阱、郵件日誌靜默、系統級與用戶級任務區別、/etc/crontab 寫法與實戰範例。

crond 核心概念

  • crond:守護進程,每分鐘掃描任務表並觸發執行。
  • crontab:任務表檔案,每行一任務,六欄位:分 時 日 月 週 命令。
  • 系統任務:/etc/crontab (含使用者欄位)。
  • 用戶任務:/var/spool/cron/username (無使用者欄位)。

時間欄位語法詳解

欄位範圍特殊符號範例
分0-59*, ,, -, /*/10 每 10 分鐘
時0-232-6 凌晨 2-6 點
日1-311,15 每月 1 號、15 號
月1-123,6,9,12 季末
週0-7 (0/7=週日)1-5 週一至週五

實戰範例


# 每 3 小時重啟 Apache
0 */3 * * * /usr/local/apache2/bin/apachectl restart

# 每週六 03:30 備份
30 3 * * 6 /webdata/bin/backup.sh

# 每月 1 號、20 號檢查磁碟
0 0 1,20 * * fsck /dev/sdb8

# 每月 5,10,15,20,25,30 號 05:10 清理 Apache 存取日誌
10 5 5,10,15,20,25,30 * * echo "" > /usr/local/apache2/logs/access_log

# 每分鐘測試 (除錯用)
* * * * * /path/to/test.sh

crontab 指令操作

指令說明
crontab -e編輯當前用戶任務表
crontab -l列出當前用戶任務表
crontab -r刪除當前用戶任務表
crontab -i刪除前確認
crontab -u user -eRoot 編輯指定用戶任務表
crontab file從檔案載入任務表

三大避坑指南

1. 環境變數缺失 → 任務不執行

現象:手動執行腳本正常,cron 不執行。
原因:cron 不載入使用者 Shell 環境 (PATH、HOME、LD_LIBRARY_PATH 等)。
解決:在 crontab 開頭**顯式宣告所有必要環境變數**:


SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
HOME=/root
MAILTO=""          # 空值不發郵件
LD_LIBRARY_PATH=/usr/local/lib

0 */3 * * * /usr/local/apache2/bin/apachectl restart

或在腳本內 source /etc/profile / source ~/.bash_profile。

2. 郵件日誌暴增 → 磁碟滿載

每次任務輸出 (stdout/stderr) 皆寄信給擁有者。
解決:重導向至 /dev/null:


0 */3 * * * /usr/local/apache2/bin/apachectl restart >/dev/null 2>&1
# 2>&1 將 stderr 導向 stdout,stdout 已導向 /dev/null

3. 系統級 vs 用戶級任務權限

  • 系統級 (/etc/crontab):含第 6 欄「使用者」,可指定 root 或其他用戶身份執行,**重啟系統任務必須寫這裡**。
  • 用戶級 (crontab -e):以該用戶身份執行,**無法執行需 root 權限的指令 (如 reboot)**。
  • Root 任務可寫 /etc/crontab 或 crontab -u root -e,但 reboot 僅在 /etc/crontab 生效。

/etc/crontab 範例


SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# 每小時執行 /etc/cron.hourly 腳本
01 * * * * root run-parts /etc/cron.hourly
# 每天 04:02 執行 daily
02 4 * * * root run-parts /etc/cron.daily
# 每週日 04:22 執行 weekly
22 4 * * 0 root run-parts /etc/cron.weekly
# 每月 1 號 04:42 執行 monthly
42 4 1 * * root run-parts /etc/cron.monthly

# 自訂系統任務:每天 02:00 重啟系統 (需寫在這裡)
0 2 * * * root /sbin/reboot

systemd Timers 現代替代方案

systemd 提供 .timer 單元,具備:

  • 精確到秒、支援日曆事件 (OnCalendar)、隨機延遲 (RandomizedDelaySec)。
  • 依賴關係管理 (After/Requires)、持久化 (Persistent=yes)。
  • 統一管理:systemctl list-timers, journalctl -u unit。

建議新專案優先使用 systemd Timers,舊有 crontab 可共存遷移。

crond 定時任務流程圖

Copyright © Windows教程網 All Rights Reserved