學習背景
一般實際的專案中多多少少都可能會涉及到定時任務的場景,比如定時
nginx日志清理及備份、tomcat日志滾動、MySQL資料庫自動備份、批量決議資料檔案匯入匯出等等,定時任務執行的物件可能是shell腳本等指令檔案,而定時任務的實作,在Java工程當中,可以通過Spring Quartz配置定時任務,在Linux服務器可以通過自帶的crond服務配置定時任務,方式有很多種,本文主要介紹Linux服務自帶的定時服務,有crond、anacron、crontab、anacrontab,這四種服務相互聯系,但又有一定的區別,
進入正文~
一、crond VS anacron
crond是Linux作業系統自帶的定時服務,自帶守護行程,一般用于運行計劃任務如系統備份、日志分割級清理,crond服務更適合在那些24x7不間斷運行的機器如服務器上運行的計劃任務,anacron則是較新版Linux作業系統自帶的定時服務,CentOS 6.0后系統會自帶anacron服務,沒有守護行程,需要依賴crond服務運行,也是常用于運行計劃任務如系統備份、日志分割級清理,但anacron服務比較適合用在一天內或一周內會重啟的機器上運行的計劃任務,
主要區別對比:
| crond | anacron |
|---|---|
有守護行程,ps -ef|grep crond查看 | 沒有守護行程,依賴crond運行 |
二進制檔案/usr/sbin/crond | 二進制檔案/usr/sbin/anacron |
定時任務全域組態檔/etc/crontab | 定時任務全域組態檔/etc/anacrontab |
可配置定時任務的時間最小單位是分鐘 | 可配置定時任務的時間最小單位是天 |
普通用戶可使用crontab -e 但/etc/crontab也僅root用戶可配置 | 僅root用戶可配置 |
| 比較適合持續運行不關機的服務器 | 比較適合可能會一天內或一周內關機,重新開機后會重新運行缺失的計劃任務的服務器 |
二、crond/crontab、anacron/anacrontab說明
2.1、crond
-
crond服務可配置最小時間單位為分鐘級的定時服務,而anacron服務僅提供日級的定時任務,并且需要依賴于crond服務來實作 -
查看
crond服務運行狀態
systemctl status crond.service

running表示運行狀態~ -
查看
crond服務后臺行程
ps -ef|grep crond

可以看到crond的守護行程是通過/usr/sbin/crond -n來實作的, -
crond的后臺行程,會每分鐘去加載是否有要執行的定時任務, -
crond服務其他常用命令
systemctl status crond.service
systemctl start crond.service
systemctl restart crond.service
systemctl stop crond.service
systemctl reload crond.service
2.2、crontab
這里crontab分為 /usr/bin/crontab和/etc/crontab
/usr/bin/crontab
/usr/bin/crontab是可執行的二進制檔案,可直接用來配置指定用戶的crond定時任務
命令:/usr/bin/crontab 選項
–選項說明:
-u定義要操作的用戶,不指定-u時默認當前用戶
-e編輯用戶的cron定時服務
-l顯示用戶的cron定時服務
-r洗掉用戶的cron定時服務
問題:為什么普通用戶可以直接通過/usr/bin/crontab配置crond定時任務?
通過
ll /usr/bin/crontab可以看到/usr/bin/crontab檔案歸屬是root用戶,但是檔案權限位含有s,權限文位+s的二進制檔案屬于是管道檔案即普通用戶也可執行該二進制檔案,但是執行后產生的行程屬于歸屬用戶,這里歸屬用戶為root

通過/usr/bin/crontab配置crond定時任務,可直接使用普通用戶,如nginx用戶執行crontab -u nginx -e 或 crontab -e
再編輯示例為內容并保存:
0 0 * * * /bin/sh /usr/nginx/nginx/tools/clearNginxLog.sh
– 示例內容說明
0 0 * * *運算式表示每天整點會執行后面的指令,編輯內容保存后的定時配置生成在/var/spool/cron(一般默認只有root用戶有權限查看)目錄下
每個用戶對應一個檔案,比如nginx用戶對應/var/spool/cron/nginx,tomcat用戶對應/var/spool/cron/tomcat

/etc/crontab
/etc/crontab是crond定時任務的全域組態檔,可一次性配置多個用戶的多個定時任務
/etc/crontab檔案方式歸屬權限為root用戶,因此只能使用root用戶才有權限編輯配置
編輯內容vi /etc/crontab,如下圖:

所標記的配置內容格式依次為:cron運算式使用哪個用戶執行要執行的命令
crond服務后臺行程每分鐘加載時,會加載到/etc/crontab中配置的這些指令, 同樣會將內容指令保存在/var/spool/cron目錄下對應的用戶檔案中,
2.3、anacron
anacron需要依賴crond服務來實作,可以通過ps -ef|grep anacron看到并沒有后臺守護行程

anacron服務通過/etc/anacrontab進行配置
2.4、 anacrontab
anacrontab指的是/etc/anacrontab檔案,用來配置anacron服務的全域定時任務- 只用
root用戶配置定時任務,編輯內容vi /etc/anacrontab

/etc/anacrontab加載程序
crond服務每分鐘加載時,會加載到/etc/anacrontab中配置的日方案、周方案、月方案對應的定時任務指令- 以
日方案定時任務為例說明- 主入口
nice run-parts /etc/cron.daily表示會加載/etc/cron.daily目錄下的可執行檔案并執行
- 主入口
- 首先會加載到
/etc/cron.daily/logrotate并執行 - 執行
/etc/cron.daily/logrotate時會加載到檔案中指定的/etc/logrotate.conf主組態檔 - 主組態檔
/etc/logrotate.conf中又include包含了外部/etc/logrotate.d目錄下的所有子組態檔 - 可以看到
/etc/logroate.d目錄下,存放的是Linux相關用戶的日志管理指令檔案,例如nginx用戶的日志清理及備份指令檔案等,

三、重要檔案及目錄說明
| 腳本或檔案或目錄 | 說明 |
|---|---|
/usr/sbin/crond | crond服務的二進制檔案 |
/usr/bin/crontab | 用戶級別的crond定時服務,二進制檔案,權限為-rwsr-xr-x,其中s表示權限位,放在用戶位置,表示行程歸屬執行的用戶 |
/etc/crontab | 系統級別的crond定時服務,普通檔案,crond服務的計劃任務組態檔 |
/etc/var/spool/cron/ | /usr/bin/crontab -e編輯的用戶配置自動生成存放路徑,如/etc/var/spool/cron/nginx |
/etc/cron.d/ | crond服務每分鐘會加載該目錄下所有檔案,并識別檔案中的可執行命令 |
/etc/cron.d/0hourly | 每分鐘會被crond服務加載到該檔案,并識別檔案中的定時命令01 * * * * root run-parts /etc/cron.hourly,表示每小時01分時會加載并執行/etc/cron.hourly目錄下所有可執行檔案 |
/etc/cron.hourly/0anacron | 當0hourly被執行時,腳本檔案0anacron也會被加載到并執行,0anacron腳本中會加載/var/spool/anacron/cron.daily中的日期與當前日期對比,不一致則執行命令/usr/sbin/anacron -s開啟anacron行程,可ps -ef|grep anacron查看 |
/usr/sbin/anacron | anacron服務的二進制檔案 |
/var/spool/anacron/cron.daily | anacron服務的執行日期記錄檔案 |
/etc/anacrontab | 系統級別的anacron定時服務,普通檔案,配置計劃任務,當anacron行程啟動時,會加載該組態檔,執行計劃任務的最小單位是天數,到指定日期后,先強制延遲M分鐘,再隨機延遲N分鐘,總共延遲M+N分鐘后才執行command命令 |
/etc/cron.daily/logrotate | /etc/anacrontab檔案中的command命令run-parts /etc/cron.daily,會執行/etc/cron.daily下所有可執行檔案,包括/etc/cron.daily/logrotate |
/usr/sbin/logrotate | 檔案/etc/cron.daily/logrotate中會使用到該命令執行計劃任務/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf |
/var/lib/logrotate/logrotate.status | 相關檔案狀態記錄檔案 |
/etc/logrotate.conf | logrotate的主組態檔,檔案中會配置默認的日志分割方案,同時會include /etc/logrotate.d表示會加載/etc/logrotate.d/下所有子組態檔內容 |
/etc/logrotate.d/ | logrotate子組態檔,用來自定義日志分割配置方案,不同應用單獨檔案配置,增強可讀性,同時會覆寫/etc/logrotate.conf主組態檔中相同的配置,例如常用應用/etc/logrotate/nginx、/etc/logrotate/tomcat等子配置 |
/var/spool/mail/nginx | 記錄日志到指定郵箱nginx,表示/usr/sbin/logrotate指定選項-m時,如/usr/sbin/logrotate -m nginx |
三、定時服務實作示例
3.1、crond + logrotate實作nginx日志清理及備份
參考我的這篇博文Linux crontab + logrotate實作日志自動清理及備份
3.2、crond + shell腳本實作nginx日志清理及備份
參考我的這篇博文nginx–自定義shell腳本實作日志自動清理、分割及壓縮備份
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/292001.html
標籤:其他
上一篇:Java 網路編程,Http 協議,Https 協議,Tcp/Ip 協議,三次握手以及四次揮手, Http 長鏈接和短連接概念以及區別,對稱加密,非對稱加密原理等
下一篇:umi改為路由改為hash模式,Ant Design Pro Components的ProLayout 選單不出來了
