一、開篇之意
什麼是定時任務?定時任務的做用?舉例:好比咱們的手機鬧鐘。vim
下面全文篇幅會進入Linux系統定時任務的水文篇,Crontab是面向操做系統的定時任務,可能咱們工做中還會接觸到面向集羣,面向項目的定時任務不或許那個應該有一個高大上的名字,恩就叫調度好了;原理都是相同,本文會從定時任務維度、Crontab配置技巧、相關重要文件、排錯技巧同時咱們也會介紹一個案例,同時引出咱們常常會遇到的錯誤,最後咱們再來講說定時任務的安全。安全
全文使用的操做系統爲CentOS7系列。bash
二、Crontab
2.1 Crontab安裝
默認狀況下全部系統幾乎都預裝了,不過這裏咱們仍是走一個形式吧,咱們經過yum進行安裝:工具
sudo yum install crontabs -y
咱們啓動服務,並配置開機自啓動:測試
sudo systemctl start crond sudo systemctl enable crond
以後,咱們能夠經過查看狀態,是否已經啓動:spa
sudo systemctl status crond
2.2 Crontab時間維度
# .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * command to be executed
Crontab支持的維度有分鐘、小時、天、月份、周其中月份和周能夠用英文單詞來表示,不過咱們依然推薦用數字來表示,同時周位置上0和7表示的都是週末的意思。操作系統
同時也不要將順序給弄錯了。(分時天月周)命令行
是的,你沒有看錯,Crontab不支持秒的維度,因此有秒的需求能夠用別的方法了。日誌
2.3 Crontab配置
上面咱們已經說了定時任務的維度,接下來我麼說說配置;配置定時任務有兩種形式,不對應該是三種,那三種呢?code
- 全局配置
- 基於用戶交互式配置
- 基於用戶非交互式的配置
2.3.1 全局配置
全局配置咱們須要經過文本編輯工具編輯/etc/crontab
這個文件,配置格式呢?
* * * * * user-name command to be executed
前面的5個*表明的是時間維度,user-name表示使用那個用戶來執行,最後就是跟上須要執行的命令了。
由於全局配置生產中用的不多,瞭解便可。
2.3.2 基於用戶交互式配置
基於用戶的交互式配置,系統幫咱們內置了一個命令crontab
, 它能夠幫助咱們完成這項工做,他有如下三個比較經常使用的參數:
-l 查看定時任務 -e 編輯定時任務 -u 指定用戶
crontab的核心原理就是,打開一個配置文件使用vi的方式
,同時在你保存的時候會幫你校驗語法規則。
看到這裏,這個工具真的是很是的強大,對也是生產之中用的最多的一種方式;那麼crontab交互命令他的語法有什麼不一樣呢?
* * * * * command to be executed
這裏請注意看,軟件省略了用戶那一欄的選項,由於是基於用戶的,默認狀況下crontab以當前用戶的身份進行配置定時任務。
2.3.3 基於用戶非交互式配置
什麼是基於用戶非交互式的配置呢?答案就是咱們直接修改相關的配置文件。
默認狀況下,crontab會在/var/spool/cron
目錄下建立對應用戶名的文件,裏面則就是你配置的定時任務了,因此咱們直接經過vim進行修改文件也是能夠的。惟一的不足就是他不支持語法檢查。
這種方式的應用場景在呢? 集羣統一管理,統一管理一個文件要比去交互式添加方便多,也更加靈活。
2.3.4 Crontab時間維度TAG
TAG是幫助咱們更加靈活的書寫時間的一種方式,咱們經常使用的TAG有:
* 表明匹配全部 , 分隔符,好比0,30;若是配置在分鐘級別上則表示半小時一次 - 鏈接段,好比17-19 等同於17,18,19 /n 除法因子,好比*/5 若是配置在分鐘級別,則是每5分鐘
上面的TAG能夠用到任何一個時間維度上,可是請結合實際狀況來時使用。
錯誤案例以下:
30 00 * * 9
周的時間維度上,怎麼可能會出現超過維度的狀況呢!
2.3.5 Crontab使用技巧
技巧一:給你的定時任務加日誌
具體怎麼加我就不闡述了
技巧二:擴展你的環境變量
默認狀況下Crontab服務帶的環境變量只有/bin/:/usr/bin
徹底不夠用,如何擴展呢?能夠在你的腳本前面從新導出你的環境變量便可。
示例:定時任務
# Sync time by init * * * * * /bin/sh /server/scripts/sync_time.sh
腳本內容
#!/bin/bash # Sync Time By Evan At 20181215 # load mod #export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin source /etc/profile #/usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null ntpdate ntp1.aliyun.com &>/dev/null if [ $? -eq 0 ];then echo "`date +%F_%T` Sync Time Ok!" >>/tmp/sync_time.log else echo "`date +%F_%T` Sync Time No!" >>/tmp/sync_time.log fi
聰明的你必定發現了, 6行和7行都是擴展環境變量的一種方式,可是我更推薦於後者,直接導入系統模塊。
2.3.6 配置定時任務的注意事項
加註釋,加註釋,加註釋,重要的事情說三遍。
命令行測試完成後必定要複製,千萬不要手敲很是容易出錯。(哪怕你是大牛)
生產定時任務必定要通過專人審覈。
記錄日誌。
以上就是我想說的注意事項了,配置一個健壯良好的定時任務就靠他了。
2.3.7 Crontab經常使用注意文件
你須要特殊注意的三個文件,準確的說是兩個文件,一個文件夾:
/var/spool/cron /etc/crontab /etc/cron.deny
/var/spool/cron
是存放基於用戶的定時任務的目錄,/etc/crontab
存放的是全局的定時任務,/etc/cron.deny
存放的是不容許用戶執行定時任務的文件。
2.3.8 Crontab排錯技巧
當你出現異常的時候,我這邊給你提供以下幾個排查方向。
- 檢查Crontab服務是否啓動
- 語法配置是否得當
- 查看日誌
- 使用工具模擬執行時間
- 注意系統時間是否配置OK
- 查看服務日誌
三、定時任務案例
3.1 系統時間同步案例
咱們只展現配置語法,具體細節請自行調整
*/5 * * * * /bin/sh /server/scripts/sync_time.sh &>/dev/null
每5分鐘,調用一次系統時間同步的定時任務。
3.2 系統備份
由於咱們這裏是定時任務,因此腳本內的細節不過多展現。
00 00 * * * /bin/sh /server/scripts/backup.sh &>/dev/null
天天凌晨調用備份腳本。
3.3 維護案例
場景以下,咱們有一個用戶叫作etluser
,集羣目前正在維護咱們但願維護時間內相關定時任務不要執行,那咱們如何作?
答案:咱們將etluser
用戶寫入到/etc/cron.deny
文件中。
3.4 補充:常見的故障
故障一:環境變量問題,前面咱們已經提到過了;
故障二:Crontab定時任務屏幕輸出,調用MailTo發送郵件,產生大量小文件;解決方法,不要有屏幕輸出便可
故障三:時間維度邏輯錯誤,好比: * 00 * * *
3.5 安全案例
系統中存在着大量的系統用戶,有些黑客就利用這些黑客造就後門,後門的大多數支撐都依賴於定時任務,因此咱們能夠將系統用戶加入到/etc/cron.deny
文件中,來爲咱們的系統增長一份保障。
咱們推薦的用戶有:
daemon bin smtp nuucp listen nobody noaccess
總結
Crontab是一個面向系統的定時任務,他的缺點就是不支持秒,不過我相信90%的場景都已經知足了。話外提一下,全部的任務都應該有能夠監控或者Check地方,好比網上的一個段子:數據備份三年,最後沒有備份成功。
好了,若是你們看到這裏有什麼疑問或者改正的地方能夠再下方留言。