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

crontab 定時任務完全指南:語法、範例、環境變坑、日誌與 systemd timer 現代替代

編輯:Linux 教學

cron 是 Linux 系統級排程服務,crontab 為使用者管理定時任務的介面。本文涵蓋 語法詳解、實戰範例、環境變數陷阱、日誌追蹤、systemd timer 現代替代方案。

crontab 指令操作

指令功能
crontab -e編輯當前使用者任務 (建立專屬編輯器)
crontab -l列出當前任務
crontab -r移除所有任務 (慎用)
crontab -u user -eroot 管理他人任務
crontab /path/file從檔案匯入

排程語法 (6 欄位)

* * * * *  執行命令
│ │ │ │ └─ 週幾 (0-7) (0 或 7 = 星期日)
│ │ │ └──── 月份 (1-12)
│ │ └────── 日期 (1-31)
│ └──────── 小時 (0-23)
└────────── 分鐘 (0-59)

特殊符號

符號含義範例
*所有可能值* * * * * 每分鐘
,列舉值0,30 * * * * 每小時 0 分與 30 分
-範圍9-18 * * 1-5 工作日 9-18 點每分鐘
/步進*/10 * * * * 每 10 分鐘

實戰範例庫

# 每天 03:00 備份資料庫
0 3 * * * /usr/local/bin/backup_db.sh >> /var/log/backup.log 2>&1

# 每小時第 5 分鐘檢查服務
5 * * * * /usr/local/bin/check_service.sh

# 每週一 04:00 清理暫存檔 (保留 7 天)
0 4 * * 1 find /tmp -type f -mtime +7 -delete

# 開機後 5 分鐘執行一次 (需 @reboot 支援)
@reboot sleep 300 && /usr/local/bin/startup_task.sh

# 每 2 天 02:00 同步時間
0 2 */2 * * /usr/sbin/ntpdate pool.ntp.org

# 工作日 09:00-18:00 每 30 分鐘監控
*/30 9-18 * * 1-5 /usr/local/bin/monitor.sh

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

  • cron 執行環境 極度精簡:PATH=/usr/bin:/bin、SHELL=/bin/sh、無使用者 profile
  • 解決方案:
    1. 腳本內使用 絕對路徑 (/usr/bin/docker、/usr/local/bin/python3)
    2. 腳本開頭 載入環境:source /etc/profile; source ~/.bash_profile
    3. crontab 內 宣告環境變數:
      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
      SHELL=/bin/bash
      MAILTO="admin@example.com"
      0 3 * * * /usr/local/bin/backup.sh

輸出與日誌管理

# 1. 重導向到檔案 (推薦)
* * * * * /cmd >> /var/log/cmd.log 2>&1

# 2. 郵件通知 (需郵件系統)
MAILTO="admin@example.com"
* * * * * /cmd

# 3. 系統日誌 (syslog/journald)
* * * * * /cmd 2>&1 | logger -t mycron

# 4. 丟棄輸出 (靜默)
* * * * * /cmd > /dev/null 2>&1

查看執行記錄

# 系統日誌
grep CRON /var/log/syslog          # Debian/Ubuntu
grep CRON /var/log/cron            # RHEL/CentOS
journalctl -u cron -f              # systemd 系統

# 使用者專屬 (若配置)
cat /var/log/user_cron.log

systemd timer:現代替代方案 (systemd 系統原生)

優勢

  • 完整 systemd 整合 (依賴、日誌、啟動順序、資源限制)
  • 精確到秒、支援單調時鐘、可隨機延遲 (RandomizedDelaySec)
  • systemctl 統一管理、journalctl 統一日誌

建立範例 (每天 03:00 備份)

# 1. 服務單元 /etc/systemd/system/backup.service
[Unit]
Description=Database Backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup_db.sh
# 可加資源限制
MemoryMax=500M
CPUQuota=50%

# 2. 計時器單元 /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true          # 開機補跑漏跑
RandomizedDelaySec=15m   # 隨機延遲 0-15 分鐘 (避免尖峰)
[Install]
WantedBy=timers.target

# 3. 啟用
systemctl daemon-reload
systemctl enable --now backup.timer

# 4. 查看
systemctl list-timers --all
journalctl -u backup.service -f

結語

crontab 簡單普及,適合用戶級簡單排程;生產環境核心服務建議遷移 systemd timer 獲得完整可觀測性與資源控制。關鍵成功因素:絕對路徑、環境變數宣告、輸出重導向、持久化日誌。

Copyright © Windows教程網 All Rights Reserved