在這一章當中咱們講述Linux任務計劃以及週期性任務的執行。node
咱們此前說過一些備份的知識,假如在某種場景當中須要作備份,例如MySQL、Redis以及mongodb等數據管理系統或相關服務及程序,對於那些數據而言,若是要作週期備份的話,則必然就要用到該功能。在例如,對於公司來說,最關鍵的就是數據,而不是系統,由於只要數據還在,則能夠快速創建一個系統,而若是數據不在,則沒法創建出系統。因此數據備份是相當重要的一件事情。
數據備份一般天天一次,甚至於每小時一次,那麼這種任務咱們就稱之爲是週期性任務。還有一種就是在凌晨的時候,把某個目錄一次性給複製到另外一臺備份主機,若是這是週期性質的話,天天作一遍,那這就是週期性任務,若是說是爲了每一個須要,只是作一次的話,那這種就是任務計劃。
他倆的本質沒有太大的差異,有一些區別的就是一種在將來的某一個時間點執行一次任務,另外一種就是重複或週期性運行某任務,總結以下:mongodb
將來的某時間點執行一次某任務:at, batch 週期性運行某任務:crontab 執行結果:會經過郵件發送給用戶;
對於Linux來說,週期性任務是要常常執行的,而單一的任務計劃也是須要在將來的某一時刻進行運行,若是用戶沒有登陸在線的話,一旦任務執行完成,會經過郵件來發送給用戶。這種電子郵件並不須要鏈接到互聯網中,而是在本地系統上會啓用一個郵件服務,這個服務只能用於本地用戶與用戶之間彼此傳遞信息。這種用戶不在線時將執行結果經過郵件發送給用戶,是一種很是行之有效的方式,這種郵件服務並非並非互聯網那種公開的服務,而是僅僅保證本地用戶在下一次登陸時的,該郵件執行的是推送消息結果的服務,因此說這個服務只能用於本機上來相互傳遞郵件消息。但若是要想工做起來,須要依賴兩點,第一就是要啓動該郵件服務,第二點就是有該用戶臨時的收發位置,不過好在CentOS
中,默認都是開啓本地郵件服務,咱們能夠用netstat
或者ss
命令來查看某個服務25號端口是否開啓。shell
# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 ::1:25 :::*
能夠看出,25號端口處於監聽開啓狀態,若是該端口開啓的話,就說明服務運行正常。那麼查看某個端口的命令以下:vim
# netstat -tnlp # ss -tnl
爲了能查看任務往來的通訊結果及狀況,咱們須要前提掌握關於郵件的收發命令,不然沒法判斷該任務計劃到底執行與否,因此咱們來查看本地電子郵件服務。bash
本地電子郵件服務: smtp:simple mail transmission protocol pop3:Post Office Protocol imap4:Internet Mail Access Protocol
以上的幾種協議瞭解便可,咱們如今主要掌握的是如何在本地主機上收發郵件,其該命令爲mail命令。它可以收發互聯網郵件,是一個很強大的文本行界面的工具,它是一種用戶收發郵件的一種工具程序,咱們稱之爲MUA,不論是WEB界面上的仍是字符界面上的,咱們都稱之爲用戶收發的一種工具程序。
要想使用mail或mailx命令收發郵件的話,方法是很簡單的,該命令的格式爲:框架
mail命令: mailx - send and receive Internet mail MUA: Mail User Agent,用戶收發郵件的工具程序; mailx [-s 'SUBJECT'] username[@hostname]
好比說,寫一個郵件發送給abc3用戶,指明主題爲'hello wuhuang!'編輯器
# mail -s 'hello wuhuang' abc3
咱們看到,底下有一行空白處,這是系統等待用戶輸入內容後,按.
進行單獨一行發送,郵件發送完成。因此說該命令是這樣的。ide
# mail -s 'hello wuhuang' abc3 wuhuangwansui! . EOT
以後咱們切換abc3,使用mail命令查看郵件是否存在,須要注意的是,mail不帶任何選項是收郵件及查看郵件的,N表示爲新郵件,按相關序號就能進行查看,那麼看完以後按q
鍵退出。工具
# su - abc3 $ mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/abc3": 1 message 1 new >N 1 root Sat Mar 10 19:43 18/580 "hello wuhuang" & 1 Message 1: From root@node1.china.org Sat Mar 10 19:43:18 2018 Return-Path: <root@node1.china.org> X-Original-To: abc3 Delivered-To: abc3@node1.china.org Date: Sat, 10 Mar 2018 19:43:17 +0800 To: abc3@node1.china.org Subject: hello wuhuang User-Agent: Heirloom mailx 12.5 7/5/10 Content-Type: text/plain; charset=us-ascii From: root@node1.china.org (root) Status: R wuhuangwansui! & q Held 1 message in /var/spool/mail/abc3 You have mail in /var/spool/mail/abc3
咱們還能夠自動給郵件給予正文,咱們剛纔是使用mail命令下的交互式模式中寫出正文,只要是從標準輸入獲取的數據,咱們可使用管道以及重定向來解決自動給予正文的問題。好比咱們使用abc3用戶給root發送一個文件fatab的內容,標題爲‘fstab file’ui
$ mail -s 'fstab file' root < /etc/fstab
還有一種是經過管道,好比說使用cat命令來查看fstab文件,經過管道送入mail命令。
$ cat /etc/fstab | mail -s 'fatab files' root
咱們退回到root用戶使用mail命令查看。
# mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/root": 2 messages 2 new >N 1 abc3@node1.china.org Sat Mar 10 20:14 29/1153 "fstab file" N 2 abc3@node1.china.org Sat Mar 10 20:18 29/1154 "fstab files" &
那麼咱們總結一下郵件正文的生成:
郵件正文的生成: (1) 交互式輸入;.單獨成行能夠表示正文結束;Ctrl+d提交亦可。 (2) 經過輸入重定向; (3) 經過管道;
那麼咱們接下來說述一下週期性任務,以及講述一下在將來的某一個時刻執行一次某種任務。
at的命令用法其實很簡單,就是使用at命令跟上一些選項,以後選擇在將來的某個時刻執行,其命令格式以下:
at [OPTION]... TIME
而TIME的使用格式及方法以下:
TIME: HH:MM [YYYY-mm-dd] noon, midnight, teatime tomorrow now+# UNIT: minutes, hours, days, OR weeks
好比說一分鐘後運行ls命令,輸入完成以後,使用Ctrl+d快捷鍵退出。而任務是能夠寫入多個的,在將來的某一時刻中同時運行。
# at now+1min at> ls at> <EOT> job 1 at Sat Mar 10 20:48:00 2018
咱們使用mail命令能夠查看運行結果。
# mail >N 3 root Sat Mar 10 20:48 28/607 "Output from your job 1" & 3 Message 3: From root@node1.china.org Sat Mar 10 20:48:01 2018 Return-Path: <root@node1.china.org> X-Original-To: root Delivered-To: root@node1.china.org Subject: Output from your job 1 To: root@node1.china.org Date: Sat, 10 Mar 2018 20:48:01 +0800 (CST) From: root@node1.china.org (root) Status: R admin admin.txt anaconda-ks.cfg Desktop Documents Downloads EOF httpd-2.4.25.tar.gz initial-setup-ks.cfg Music Pictures Public scripts Templates Videos &
那麼咱們須要注意的是,當多個用戶執行任務管理繁雜時,以隊列的形式用來管理,默認爲a隊列。
at的做業有隊列,用單個字母標識,默認都使用a隊列。
at命令的經常使用選項以下:
經常使用選項: -l:查看做業隊列,至關於atq; -f /PATH/TO/SOMEFILE:從指定文件中讀取做業任務,而不用在交互式輸入; -d:刪除指定做業,至關於atrm; -c:查看指定做業的具體內容; -q QUEUE:指明隊列; 注意:做業執行結果是以郵件的形式發送給提交做業的用戶;
那麼咱們在文件中編寫任務,交給at命令在兩分鐘以後執行,這樣的話不須要用戶進行交互,步驟以下:
# vim at.tasks echo "Hello World" echo "Do you like one you see?" echo "Boy next door!" # at -f at.tasks now+2min
batch和at命令是同樣的,但二者不一樣之處在於batch命令不像at命令同樣,指定做業在某個時間運行,而是讓系統自行選擇,在系統較爲空閒的時間去執行指定的任務。也就是說,不用指定時間了,但其它的使用方法與at命令基本相同。
週期性任務計劃採用的是cron機制,對於cron而言,必須有一種機制到達某種時間執行將其結果進行提交,這種機制就是一種服務,咱們須要這種服務一直出於運行狀態,而這種服務一直運行在後臺,而這種服務須要檢查那些任務該執行,因此說這是須要一種服務程序,始終監聽並查看對應的時間點去運行的任務是否符合條件,然後將其運行,這種服務程序,在系統上所依靠的程序包爲cronle,提供了crond守護進程及相關輔助工具。
週期性任務計劃:cron 服務程序: cronle:主程序包,提供了crond守護進程及相關輔助工具; 確保crond守護進程(daemon)出於運行狀態: CentOS 7 # systemctl status crond.service Active: active (running)... ... CentOS 6 # service crond status ... is running.
只有以上兩種守護進程出於運行狀態,咱們才能保證其在運行計劃中的任務才能能夠實現,所以也要像at命令同樣,也是須要提交一個或多個任務做業給crond,只不過提交crond做業的方式不一樣於at,它是須要使用專用的配置文件,該文件有固定的格式,不過不建議使用文本編輯器直接編輯此文件;可以使用crontab命令來解決此問題。該命令會自動檢查語法錯誤,一旦發現有什麼錯誤時,會發出提示或直接拒絕提交。
而cron任務共分爲兩類,一種是系統cron的任務,是爲了系統完成自身的維護任務,另外一種是用戶cron任務,是爲了用戶的某個須要來實現的。總結以下:
向crond提交做業的方式不一樣於at,它須要使用專用的配置文件,此文件有固定格式,不建議使用文本編輯器直接編輯此文件;要使用crontab命令。 cron任務分爲兩類: 系統cron任務:主要用於實現系統自身的維護; 手動編輯:/etc/crontab文件; 用戶cron任務: 命令:crontab命令;
對於第一種系統任務來說,咱們不須要手動進行編輯,在系統安裝的時候,該任務就會建立完成,咱們無需指定,但用戶cron是咱們須要使用的,而且須要遵照該任務的格式即標準。
咱們如今查看一下系統的cron任務的配置文件,該路徑在/etc/目錄下。
系統cron的配置格式: # cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- 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 # | | | | | # * * * * * user-name command to be executed
SHELL:指定shell解釋器所運行的腳本或命令; PATH:指定某種路徑去尋找該命令,不過因爲路徑太少,能夠在寫任務時使用絕對路徑,或自定義PATH環境變量; MAILTO:運行任務的執行結果經過郵件發送給用戶,默認爲發送給root;
雖然系統cron配置文件基本不須要更改,或者說不多編輯,可是咱們須要瞭解一下cron文件具體的每一行的解釋,記住它的要點。
注意: (1) 每行定義一個cron任務,共7個字段; * * * * * :定義週期性時間; user-name:運行任務的用戶身份; command to be executed:任務 (2) 此處的環境變量不一樣於用戶登陸後得到的環境,所以,建議命令使用絕對路徑,或者自定義PATH環境變量; (3) 執行結果郵件發送給MAILTO指定的用戶;
以上就是系統cron的配置,那麼接下來咱們說一下用戶cron的配置。對於用戶cron來說,沒有username這一項了,而用戶cron的配置文件的路徑在:/var/spool/cron/USERNAME。因此在用戶cron當中則不須要用戶名這一項了。
用戶cron的配置格式: SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- 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
咱們須要注意的是,系統cron文件和用戶cron文件略有區別,其總結以下:
注意: (1) 每行定義一個cron任務,共6個字段; (2) 此處的環境變量不一樣於用戶登陸後得到的環境,所以,建議命令使用絕對路徑,或者自定義PATH環境變量; (3) 郵件發送給當前用戶;
那麼文件格式大致從以上的框架中進行了解,那麼接下來咱們如何指定時間點。
對於用戶cron和系統cron來講,都是通用的,那麼如何指定時間點來講,有如下實現機制:
(1) 特定值: 給定時間點有效取值範圍內的值; 注意:day of week和day of month通常不一樣使用; (2) * 給定時間點有效取值範圍內的全部值:表"每..";找時間點最小的* (3) 離散取值:, 在給定的時間點上使用逗號分開多個值便可; #,#,# (4) 連續取值: 在時間點上使用-鏈接開頭和結束; #-# (5) 在制定時間點上,定義步長; /#:#即步長; 注意: (1) 指定的時間不能被步長整除時,其意義將不復存在; (2) 最小時間單位爲"分鐘",想完成"秒"級任務,得須要額外借助於其它機制; 定義成每分鐘任務:而在利用腳本實如今每分鐘以內,循環執行屢次;
示例:
(1) 3 * * * *:每小時執行一次,每次爲三分鐘; (2) 4 3 * * 5:每週執行一次;每週5的4點3分; (3) 5 6 7 * *:每個月執行一次;每個月7號的6點5分; (4) 7 8 9 10 *:每一年執行一次,每一年10月9號8點7分; (5) 9 8 * * 3,7:每週三和週日; (6) 0 8,20 * * 3,7 (7) 0 9-18 * * 1-5 (8) */5 * * * *:每五分鐘執行一次某任務;
若是某個用戶想定義cron任務,咱們就可使用crontab命令就能夠了,其命令格式爲:
crontab命令: crontab [-u user] [-l | -r |-e][-i]
該命令選項爲:
-e:編輯任務; -l:列出全部任務; -r:移除全部任務;即刪除/var/spool/cron/USERNAME文件; -i:在使用-r選項移除全部任務時提示用戶確認; -u user:root用戶可爲指定用戶管理cron任務;
須要注意的是,不能使用vim編輯器來編寫任務計劃,由於不能檢查其語法錯誤。
若是你運行的結果沒有問題時,能夠選擇不接收郵件。
注意:運行結果以郵件通知給當前用戶;若是拒絕接收郵件: (1) COMMAND > /dev/null (2) COMMAND &> /dev/null
還須要注意一點的是:
注意:定義COMMAND時,若是命令須要用到%,須要對其轉義;但放置於單引號中的%不用轉義亦可;