cron
是一個 Unix 類操作系統中的時間調度守護進程,用于在特定的時間或間隔運行指定的命令或腳本。它非常適合自動化系統管理和維護任務,如備份、日志輪轉、系統監控等。以下是 cron
守護進程的詳細介紹。
cron
守護進程的工作原理
-
crontab
文件:cron
從稱為crontab
(cron table)的文件中讀取任務計劃。每個用戶都有自己的crontab
文件,系統級任務在/etc/crontab
和/etc/cron.d/
目錄中定義。crontab
文件中每行定義一個計劃任務,包括時間表達式和要執行的命令。
-
定期檢查:
cron
守護進程每分鐘檢查一次crontab
文件和目錄/var/spool/cron/crontabs/
、/etc/cron.d/
、/etc/crontab
,以確定是否有任務需要執行。
-
執行任務:
- 當當前時間與
crontab
文件中的時間表達式匹配時,cron
執行相應的命令或腳本。
- 當當前時間與
crontab
文件格式
crontab
文件中的每一行代表一個任務,格式如下:
* * * * * command_to_be_executed
- - - - -
| | | | |
| | | | +----- 一周中的星期幾 (0 - 7) (星期天為 0 或 7)
| | | +------- 月份 (1 - 12)
| | +--------- 日期 (1 - 31)
| +----------- 小時 (0 - 23)
+------------- 分鐘 (0 - 59)
例如,每天凌晨 2 點運行備份腳本:
0 2 * * * /path/to/backup.sh
常用的 crontab
命令
查看 crontab
文件
crontab -l
編輯 crontab
文件
crontab -e
刪除 crontab
文件
crontab -r
從文件安裝 crontab
crontab filename
系統級 crontab
文件
除了用戶級 crontab
文件外,還有一些系統級 crontab
文件:
-
/etc/crontab
:系統級的crontab
文件,格式與用戶級略有不同。它包含了一個用戶字段,指定哪個用戶運行任務。SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root# m h dom mon dow user command 0 2 * * * root /path/to/backup.sh
-
/etc/cron.d/
目錄:可以包含多個任務文件,文件中的每行格式與/etc/crontab
相同。
cron
特殊字符串
cron
還支持一些特殊的字符串,用于簡化時間表達式:
@reboot
:在系統重啟后運行。@yearly
或@annually
:每年運行一次,相當于0 0 1 1 *
。@monthly
:每月運行一次,相當于0 0 1 * *
。@weekly
:每周運行一次,相當于0 0 * * 0
。@daily
或@midnight
:每天運行一次,相當于0 0 * * *
。@hourly
:每小時運行一次,相當于0 * * * *
。
例如,每次系統重啟后運行腳本:
@reboot /path/to/startup.sh
安全性和最佳實踐
-
限制訪問:
- 僅允許受信任的用戶編輯和安裝
crontab
文件。 - 使用
/etc/cron.allow
和/etc/cron.deny
文件控制哪些用戶可以使用crontab
命令。
- 僅允許受信任的用戶編輯和安裝
-
日志記錄:
- 配置
cron
日志記錄,以監控任務執行情況和故障。 - 在
/etc/rsyslog.conf
或/etc/rsyslog.d/
配置文件中確保cron
日志記錄是啟用的,例如:cron.* /var/log/cron.log
- 配置
-
使用絕對路徑:
- 在
crontab
中指定命令和腳本的絕對路徑,確保任務在預期的位置運行。
- 在
-
環境變量:
- 在
crontab
文件中設置必要的環境變量,如PATH
,確保任務能夠找到需要的命令和腳本。
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
- 在
例子
用戶級 crontab
示例
# 每天凌晨 1 點運行備份腳本
0 1 * * * /usr/local/bin/backup.sh# 每小時檢查一次磁盤使用情況
0 * * * * /usr/local/bin/check_disk.sh# 每月 1 號凌晨 2 點清理日志文件
0 2 1 * * /usr/local/bin/clean_logs.sh
系統級 crontab
示例
# /etc/crontabSHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root# m h dom mon dow user command
0 3 * * * root /usr/local/bin/system_backup.sh
15 4 * * 7 root /usr/local/bin/weekly_report.sh
通過了解和正確配置 cron
守護進程,可以實現系統管理和維護任務的自動化,極大提高工作效率和系統可靠性。