最近開發時遇到例行繁瑣的事務,解決以後便寫下這篇文章跟大家分享,請大家不吝指教!
閱讀本篇文章,你將學到:
Crontab(cron table)是 Unix/Linux 系統中的排程工具,用於安排定期執行的任務。系統會透過 cron 守護進程(daemon)定期檢查並執行設定的任務。
crontab -l
crontab -e
# 每天早上 8:30 執行
30 8 * * * /path/to/script.sh
# 每週一至週五下午 6 點執行
0 18 * * 1-5 /path/to/script.sh
# 每兩小時執行一次
0 */2 * * * /path/to/script.sh
欄位 | 分鐘 | 小時 | 日期 | 月份 | 星期 | 命令 |
---|---|---|---|---|---|---|
範例 | 30 | 8 | * | * | 1-5 | /path/to/script.sh |
說明 | 第30分 | 早上8點 | 每日 | 每月 | 週一到週五 | 要執行的指令 |
欄位 | 可用範圍 | 說明 |
---|---|---|
分鐘 | 0-59 | 每小時的第幾分鐘 |
小時 | 0-23 | 24小時制 |
日期 | 1-31 | 每月的第幾天 |
月份 | 1-12 | 一年中的第幾月 |
星期 | 0-7 | 0和7都代表星期日 |
符號 | 名稱 | 用途 | 範例 |
---|---|---|---|
* | 星號 | 代表任何時間 | * * * * * 每分鐘執行 |
, | 逗號 | 代表多個時間點 | 0,15,30,45 * * * * 每15分鐘執行 |
- | 減號 | 代表時間範圍 | 0 9-17 * * * 朝九晚五每小時執行 |
/ | 斜線 | 代表執行間隔 | */15 * * * * 每15分鐘執行 |
@yearly | 年度 | 每年執行一次 | @yearly /script.sh |
@monthly | 月份 | 每月執行一次 | @monthly /script.sh |
@weekly | 週期 | 每週執行一次 | @weekly /script.sh |
@daily | 日期 | 每天執行一次 | @daily /script.sh |
@hourly | 小時 | 每小時執行一次 | @hourly /script.sh |
@reboot | 重啟 | 系統重啟時執行 | @reboot /script.sh |
身為一位系統管理者,您可能遇到這樣的需求:
如果手動處理,您需要:
使用 crontab 自動化後,這些工作都能自動完成!
# ====================================
# AWS 帳單自動化處理系統
# 功能:自動下載、處理、匯入每日帳單
# 更新:2024-01-01
# ====================================
# 環境變數設定
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 專案路徑設定
SCRIPT_PATH=/to/your/path
LOG_PATH=/var/log/billing
# === 每日任務 ===
# 早上 8:30 從 AWS 下載昨日帳單
30 8 * * * python3 $SCRIPT_PATH/aws_bill_download.py --daily --date=$(date -d "yesterday" +\%Y-\%m-\%d) >> $LOG_PATH/download.log 2>&1
# 早上 9:00 處理並匯入資料庫
0 9 * * * python3 $SCRIPT_PATH/process_daily_bill.py >> $LOG_PATH/process.log 2>&1
# === 每月任務 ===
# 每月 4 號早上 8:00 下載上個月完整帳單
0 8 4 * * python3 $SCRIPT_PATH/aws_bill_download.py --monthly --month=$(date -d "last month" +\%Y-\%m) >> $LOG_PATH/monthly.log 2>&1
# 每月 4 號早上 8:30 產生月度報表
30 8 4 * * python3 $SCRIPT_PATH/generate_monthly_report.py >> $LOG_PATH/report.log 2>&1
# === 資料備份 ===
# 每天午夜 12:00 備份資料庫
0 0 * * * $SCRIPT_PATH/backup_database.sh >> $LOG_PATH/backup.log 2>&1
環境變數
路徑管理
任務分類
日誌記錄
2>&1
同時記錄標準輸出和錯誤日期處理
# 取得昨天日期
$(date -d "yesterday" +\%Y-\%m-\%d)
# 取得上個月
$(date -d "last month" +\%Y-\%m)
錯誤處理
# 記錄完整執行資訊
command >> logfile.log 2>&1
註解說明
===
分隔不同區塊透過這樣的設定,您可以:
這就是 crontab 在實務上的強大應用!