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 cron 與 crontab 定時任務完整指南

編輯:Linux 教學

前言

cron(守護進程)與 crontab(配置表)是 Linux 系統級定時任務的基石。掌握其語法、環境變數陷阱、日誌追蹤、系統級與使用者級配置差異,能讓備份、清理、報表、同步等自動化作業穩健運行。本文涵蓋服務管理、crontab 格式、特殊符號、實戰範例、故障排查全流程。

一、cron 服務管理


# 服務名稱可能為 cron、crond、cronie
systemctl status cron      # Debian/Ubuntu
systemctl status crond     # CentOS/RHEL

# 啟動/停止/重啟/重載
systemctl start cron
systemctl enable cron      # 開機自啟

# 手動啟動(調試用)
/usr/sbin/cron -f -L 15    # 前景運行,日誌等級 15

二、crontab 指令操作

儲存位置

  • 使用者表:/var/spool/cron/username(或 /var/spool/cron/crontabs/username)
  • 系統表:/etc/crontab、/etc/cron.d/ 目錄下檔案

三、crontab 時間格式與特殊符號


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

特殊符號

指令功能範例
crontab -e編輯當前使用者 crontab(進入 $EDITOR)crontab -e
crontab -l列出當前使用者 crontabcrontab -l
crontab -r刪除當前使用者 crontab(慎用)crontab -r
crontab -u user -eroot 編輯指定使用者 crontabcrontab -u www -e
crontab -u user -lroot 查看指定使用者 crontabcrontab -u www -l
符號含義範例說明
*所有合法值* * * * *每分鐘
,列舉離散值0 8,12,18 * * *每天 8:00、12:00、18:00
-範圍0 9-17 * * 1-5工作日 9-17 點整點
/步長(每 N 個單位)*/10 * * * *每 10 分鐘
LLast(最後一天/最後一個星期幾)0 0 L * *每月最後一天午夜
W最近工作日0 0 15W * *每月 15 號最近工作日
#第 N 個星期幾0 0 * * 1#2每月第二個星期一

四、經典範例集


# 每天 06:00 問候
0 6 * * * echo "Good morning" >> /tmp/greeting.log

# 每 2 小時檢查磁碟
0 */2 * * * df -h >> /tmp/disk.log

# 晚上 23:00 到早上 07:00 每 2 小時,外加 08:00
0 23-7/2,8 * * * echo "Night watch" >> /tmp/night.log

# 每月 4 號及每週一至三 11:00
0 11 4 * 1-3 /usr/local/bin/monthly_weekly.sh

# 每年 1 月 1 日 04:00
0 4 1 1 * /usr/local/bin/yearly.sh

# 開機執行(@reboot 特殊關鍵字)
@reboot /usr/local/bin/startup_check.sh

# 每分鐘執行(壓測/監控)
* * * * * /usr/local/bin/health_check.sh

五、環境變數與執行上下文陷阱(最常見失敗原因)

差異互動 Shellcron 環境對策
PATH/usr/local/bin:/usr/bin:.../usr/bin:/bin腳本內 export PATH=... 或命令用絕對路徑
SHELL/bin/bash/bin/shcrontab 首行 SHELL=/bin/bash
HOME/home/user/ (或 /root)腳本內 cd /absolute/path
環境變數完整繼承極少腳本開頭 source /etc/profile; source ~/.bashrc
標準輸出/錯誤終端顯示郵件寄給擁有者重導向 >/var/log/job.log 2>&1

最佳實踐模板


# /etc/cron.d/myapp  或  crontab -e 內容
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
MAILTO="admin@example.com"  # 錯誤通知郵箱,空字串關閉郵件

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

六、系統級定時任務目錄

目錄執行頻率適用場景
/etc/cron.hourly/每小時輕量同步、清理
/etc/cron.daily/每天(預設 06:25)logrotate、備份、更新資料庫
/etc/cron.weekly/每週(預設 週日 06:47)深度清理、報表生成
/etc/cron.monthly/每月(預設 1 號 06:52)帳單、歸檔

將可執行腳本(chmod +x)放入對應目錄,由 run-parts 執行。/etc/crontab 定義具體時間。

七、故障排查清單

  1. 服務是否運行:systemctl status cron
  2. 語法是否正確:crontab -l 檢查、crontab -e 存檔時會語法檢查
  3. 命令是否可執行:手動在終端執行完整命令驗證
  4. 路徑/環境變數:腳本加 set -x; exec >>/tmp/debug.log 2>&1 觀察
  5. 權限:腳本擁有者需有執行權限,寫入目標目錄權限
  6. 日誌查看:grep CRON /var/log/syslog(Debian)或 /var/log/cron(CentOS)
  7. 郵件通知:mail 指令查看 root/使用者信箱

八、systemd Timer 現代替代(精度更高、日誌整合、依賴管理)


# /etc/systemd/system/backup.timer
[Unit]
Description=Daily DB Backup

[Timer]
OnCalendar=daily 03:00
Persistent=true
RandomizedDelaySec=15m

[Install]
WantedBy=timers.target

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

systemctl daemon-reload
systemctl enable --now backup.timer
systemctl list-timers --all

九、總結

cron 簡單、普及、相容性極佳,仍是定時任務首選。關鍵在於環境變數顯式宣告、絕對路徑、輸出重導向、日誌監控四大鐵律。對於需要秒級精度、啟動順序依賴、資源限制的場景,請遷移至 systemd Timer。

Copyright © Windows教程網 All Rights Reserved