crontab
是Unix/Linux系統中用于設置周期性任務的工具,通過編輯配置文件實現定時執行命令或腳本。以下是其語法規則和核心要點:
一、基本格式
* * * * * command
- - - - -
| | | | |
| | | | +----- 星期幾(0-7,0和7代表周日)
| | | +---------- 月份(1-12或Jan-Dec)
| | +--------------- 日期(1-31)
| +-------------------- 小時(0-23)
+------------------------- 分鐘(0-59)
示例:
0 2 * * * /usr/bin/backup.sh # 每天凌晨2點執行備份腳本
二、時間字段詳解
1. 分鐘(0-59)
*
:每分鐘執行一次。*/5
:每5分鐘執行一次(等同于0,5,10,...,55
)。15,30
:每小時的15分和30分執行。1-10
:每小時的1到10分鐘執行。
2. 小時(0-23)
*
:每小時執行一次。8-17
:每天8點到17點(工作時間)執行。22
:每天22點(晚上10點)執行。
3. 日期(1-31)
*
:每月任意日期執行。1
:每月1號執行。1,15
:每月1號和15號執行。1-7
:每月1號到7號執行。
4. 月份(1-12或Jan-Dec)
*
:每年任意月份執行。12
:每年12月執行。3-6
:每年3月到6月執行。
5. 星期幾(0-7,0和7代表周日)
*
:每周任意一天執行。0
:每周日執行。1-5
:每周一到周五執行。6
:每周六執行。SUN
:等價于0
(支持英文縮寫)。
三、特殊符號與快捷方式
1. 通配符與操作符
*
:匹配所有值(例如* * * * *
表示每分鐘執行)。,
:分隔多個值(例如1,3,5
表示1號、3號、5號)。-
:指定范圍(例如8-10
表示8點到10點)。/
:步長間隔(例如*/15
表示每15分鐘一次)。
2. 預定義快捷方式
@reboot
:系統重啟后執行一次。@yearly
:每年1月1日0點執行(等價于0 0 1 1 *
)。@monthly
:每月1日0點執行(等價于0 0 1 * *
)。@weekly
:每周日0點執行(等價于0 0 * * 0
)。@daily
:每天0點執行(等價于0 0 * * *
)。@hourly
:每小時0分執行(等價于0 * * * *
)。
3. 特殊處理
- %符號:在命令中表示換行,需用
\%
轉義(例如date +\%Y\%m\%d
)。 - 日期與星期組合:若同時設置日期和星期(如
0 0 15 * 1
),任務會在滿足任一條件時執行,可能導致意外觸發,需謹慎使用。
四、命令與執行細節
-
命令路徑:
- 必須使用絕對路徑(例如
/usr/bin/backup.sh
),避免因環境變量缺失導致執行失敗。 - 若依賴特定環境變量,可在命令前加載(例如
. /etc/profile; /path/to/script.sh
)。
- 必須使用絕對路徑(例如
-
輸出重定向:
- 默認將輸出通過郵件發送給用戶,可通過以下方式屏蔽:
0 2 * * * /usr/bin/backup.sh >> /dev/null 2>&1 # 標準輸出和錯誤輸出重定向到黑洞
- 若需記錄日志,可指定文件:
0 2 * * * /usr/bin/backup.sh >> /var/log/backup.log 2>&1
- 默認將輸出通過郵件發送給用戶,可通過以下方式屏蔽:
-
用戶權限:
- 普通用戶通過
crontab -e
編輯個人任務,系統級任務需修改/etc/crontab
或/etc/cron.d/
下的文件。 - 通過
cron.allow
和cron.deny
文件控制用戶是否有權限使用crontab
。
- 普通用戶通過
五、示例與場景
-
每分鐘執行:
* * * * * /usr/bin/monitor.sh # 實時監控系統狀態
-
每周一至周五下午5點執行:
0 17 * * 1-5 /usr/bin/send-report.sh # 發送工作日報告
-
每月最后一天執行:
0 0 L * * /usr/bin/monthly-cleanup.sh # L代表每月最后一天(部分系統支持)
-
系統重啟后執行:
@reboot /usr/bin/start-services.sh # 啟動服務
-
每兩小時執行:
0 */2 * * * /usr/bin/check-status.sh # 每小時0分執行,間隔2小時
六、注意事項
-
時區問題:
crontab
使用系統時區,若需跨時區執行任務,需在腳本中顯式指定時區(例如TZ=Asia/Shanghai
)。
-
并發控制:
- 若任務執行時間較長,需避免重復觸發。可通過鎖文件(如
flock
)或cron
的withChain
機制(如Go的cron.SkipIfStillRunning
)實現。
- 若任務執行時間較長,需避免重復觸發。可通過鎖文件(如
-
調試與日志:
- 查看系統日志:
tail -f /var/log/cron
(部分系統路徑為/var/log/syslog
)。 - 測試任務時,可臨時縮短時間間隔(如
*/1 * * * *
)并觀察輸出。
- 查看系統日志:
-
系統差異:
- 不同Unix變體(如HP-UX、AIX)對
*/n
語法的支持可能不同,需用列舉法替代(如0,20,40 * * * *
表示每20分鐘一次)。
- 不同Unix變體(如HP-UX、AIX)對
七、管理命令
命令 | 說明 |
---|---|
crontab -e | 編輯當前用戶的定時任務 |
crontab -l | 列出當前用戶的定時任務 |
crontab -r | 刪除當前用戶的所有定時任務 |
crontab -u user -e | 編輯指定用戶的定時任務(需root權限) |
系統級任務配置文件:
/etc/crontab
:全局任務配置,可指定執行用戶(如root
)。/etc/cron.d/
:存放系統級定時任務文件,支持更靈活的配置。
八、特別示例
0 0/10 * * *
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └─ 星期幾 (0-7, 0和7都代表周日)
│ │ │ └─── 月份 (1-12)
│ │ └───── 日期 (1-31)
│ └─────── 小時 (0-23)
└───────── 分鐘 (0-59)
詳細解釋:
- 分鐘字段:
0
表示每小時的第0分鐘(即整點) - 小時字段:
0/10
表示從0點開始,每隔10小時執行一次(即0點、10點、20點) - 日期字段:
*
表示每天 - 月份字段:
*
表示每月 - 星期字段:
*
表示每周的每一天
執行時間:
這個表達式會在每天的 00:00、10:00 和 20:00 準時執行任務。
常見誤區提醒:
如果你的意圖是每10分鐘執行一次,正確的表達式應該是:
*/10 * * * * # 注意分鐘字段的寫法
0 0/10 * * *
是每10小時執行一次,且僅在整點觸發。請根據實際需求確認是否符合預期。
九、常見錯誤與排查
-
任務未執行:
- 檢查命令路徑是否正確。
- 確認時間表達式是否符合預期(可用在線工具驗證,如Cron Expression Generator)。
- 查看日志確認是否有權限或路徑錯誤。
-
輸出未重定向:
- 檢查是否遺漏
2>&1
,導致錯誤輸出未被捕獲。
- 檢查是否遺漏
-
環境變量缺失:
- 在命令前顯式加載環境變量(如
. /etc/profile
),或使用which
獲取命令絕對路徑。
- 在命令前顯式加載環境變量(如
通過合理使用crontab
,可高效實現自動化運維、數據備份、監控等任務。掌握其語法規則和執行細節,能顯著提升系統管理效率。