Crontab定時任務

一、開篇之意

什麼是定時任務?定時任務的做用?舉例:好比咱們的手機鬧鐘。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

  1. 全局配置
  2. 基於用戶交互式配置
  3. 基於用戶非交互式的配置

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排錯技巧

當你出現異常的時候,我這邊給你提供以下幾個排查方向。

  1. 檢查Crontab服務是否啓動
  2. 語法配置是否得當
  3. 查看日誌
  4. 使用工具模擬執行時間
  5. 注意系統時間是否配置OK
  6. 查看服務日誌

三、定時任務案例

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地方,好比網上的一個段子:數據備份三年,最後沒有備份成功。

好了,若是你們看到這裏有什麼疑問或者改正的地方能夠再下方留言。

相關文章
相關標籤/搜索