萬盛學電腦網

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

Linux crontab 定時任務配置完整指南與最佳實務

cron 是 Linux 系統級排程服務,透過 crontab 定義週期性任務。掌握時間表達式、環境變數、日誌追蹤與除錯技巧,能確保自動化作業穩定執行。

crontab 時間表達式


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

特殊符號與進階語法

符號含義範例
*任意值* * * * * 每分鐘
,列舉0 8,12,18 * * * 每天 8/12/18 點
-範圍0 9-18 * * 1-5 工作日 9-18 點整點
/步長*/15 * * * * 每 15 分鐘
@yearly每年 1/1 00:000 0 1 1 *
@monthly每月 1 號 00:000 0 1 * *
@weekly每週日 00:000 0 * * 0
@daily每天 00:000 0 * * *
@hourly每小時 0 分0 * * * *
@reboot開機啟動系統啟動時執行一次

crontab 操作指令


crontab -e          # 編輯當前使用者 crontab
crontab -l          # 列出當前 crontab
crontab -r          # 移除當前 crontab (慎用)
crontab -u user -e  # root 編輯指定使用者 crontab

系統級排程 /etc/crontab 與 /etc/cron.d/


# /etc/crontab 格式多一個 USER 欄位
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 範例:每天 02:30 以 root 執行備份
30 2 * * * root /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

# /etc/cron.d/ 目錄下放置獨立檔案 (套用相同格式)
# 檔案命名建議:服務名稱,如 nginx-logrotate, certbot-renew

環境變數與執行環境陷阱

  • cron 執行環境極度精簡:PATH=/usr/bin:/bin、無 HOME、SHELL=/bin/sh
  • 最佳實務:腳本開頭明確宣告 PATH、HOME、SHELL=/bin/bash,或使用絕對路徑
  • 輸出重導向:> /var/log/job.log 2>&1 或 &>> /var/log/job.log (Bash 4+)
  • MAILTO="" 可關閉郵件通知

實戰範例


# 每小時備份資料庫
0 * * * * /usr/bin/mysqldump -u backup -p'secret' db | gzip > /backup/db_$(date +\%Y\%m\%d_\%H\%M).sql.gz

# 每天凌晨清理 30 天前日誌
0 3 * * * find /var/log/app -name "*.log" -mtime +30 -delete

# 開機啟動延遲服務
@reboot sleep 30 && /opt/myapp/bin/start.sh

# 每週一產生報表並郵寄
0 9 * * 1 /usr/local/bin/gen_report.sh | mail -s "Weekly Report" admin@example.com

除錯與監控技巧

  • 檢查 cron 服務:systemctl status cron / systemctl status crond
  • 查看執行日誌:grep CRON /var/log/syslog 或 journalctl -u cron
  • 測試命令:先在終端手動執行,確認無誤再加入 crontab
  • 鎖定機制防止重疊:flock -n /tmp/job.lock -c "cmd" 或腳本內 flock -n 9 || exit 1 9>/tmp/job.lock
  • 健康檢查:在腳本結束呼叫 curl -fsS -o /dev/null https://hc-ping.com/xxx (Healthchecks.io)

systemd Timer 現代替代方案


# /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer
Requires=backup.service

[Timer]
OnCalendar=daily
Persistent=true
RandomizedDelaySec=15m

[Install]
WantedBy=timers.target

# /etc/systemd/system/backup.service
[Unit]
Description=Backup Service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh

優點:精確控制、依賴管理、日誌整合、隨機延遲避免驚群、systemd 生態整合。

建立標準化的排程部署流程(腳本化、版控、測試、監控),將 crontab 從「黑箱」轉化為可觀測、可維運的自動化基礎設施。

copyright © 萬盛學電腦網 all rights reserved