2018-3-10Linux系統管理(9)任務計劃
一、任務計劃
我們此前說過一些備份的知識,假如在某種場景當中需要做備份,例如MySQL、Redis以及mongodb等數據管理系統或相關服務及程序,對於那些數據而言,如果要做周期備份的話,則必然就要用到該功能。在例如,對於公司來講,最關鍵的就是數據,而不是系統,因為只要數據還在,則可以快速建立一個系統,而如果數據不在,則無法建立出系統。所以數據備份是至關重要的一件事情。
數據備份通常每天一次,甚至於每小時一次,那麽這種任務我們就稱之為是周期性任務。還有一種就是在淩晨的時候,把某個目錄一次性給復制到另一臺備份主機,如果這是周期性質的話,每天做一遍,那這就是周期性任務,如果說是為了每個需要,只是做一次的話,那這種就是任務計劃。
未來的某時間點執行一次某任務:at, batch 周期性運行某任務:crontab 執行結果:會通過郵件發送給用戶;
對於Linux來講,周期性任務是要經常執行的,而單一的任務計劃也是需要在未來的某一時刻進行運行,如果用戶沒有登錄在線的話,一旦任務執行完成,會通過郵件來發送給用戶。這種電子郵件並不需要連接到互聯網中,而是在本地系統上會啟用一個郵件服務,這個服務只能用於本地用戶與用戶之間彼此傳遞信息。這種用戶不在線時將執行結果通過郵件發送給用戶,是一種非常行之有效的方式,這種郵件服務並不是並不是互聯網那種公開的服務,而是僅僅保證本地用戶在下一次登錄時的,該郵件執行的是推送消息結果的服務,所以說這個服務只能用於本機上來相互傳遞郵件消息。但如果要想工作起來,需要依賴兩點,第一就是要啟動該郵件服務,第二點就是有該用戶臨時的收發位置,不過好在
CentOS
中,默認都是開啟本地郵件服務,我們可以用netstat
或者ss
命令來查看某個服務25號端口是否開啟。# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 ::1:25 :::*
可以看出,25號端口處於監聽開啟狀態,如果該端口開啟的話,就說明服務運行正常。那麽查看某個端口的命令如下:
# netstat -tnlp # ss -tnl
1.1 mailx命令
為了能查看任務往來的通信結果及情況,我們需要前提掌握關於郵件的收發命令,否則無法判斷該任務計劃到底執行與否,所以我們來查看本地電子郵件服務。
本地電子郵件服務: 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
我們看到,底下有一行空白處,這是系統等待用戶輸入內容後,按.
進行單獨一行發送,郵件發送完成。所以說該命令是這樣的。
# 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 [email protected] Sat Mar 10 19:43:18 2018 Return-Path: <[email protected]> X-Original-To: abc3 Delivered-To: [email protected] Date: Sat, 10 Mar 2018 19:43:17 +0800 To: [email protected] Subject: hello wuhuang User-Agent: Heirloom mailx 12.5 7/5/10 Content-Type: text/plain; charset=us-ascii From: [email protected] (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’
$ 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 [email protected] Sat Mar 10 20:14 29/1153 "fstab file" N 2 [email protected] Sat Mar 10 20:18 29/1154 "fstab files" &
那麽我們總結一下郵件正文的生成:
郵件正文的生成: (1) 交互式輸入;.單獨成行可以表示正文結束;Ctrl+d提交亦可。 (2) 通過輸入重定向; (3) 通過管道;
那麽我們接下來講述一下周期性任務,以及講述一下在未來的某一個時刻執行一次某種任務。
二、at命令
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 [email protected] Sat Mar 10 20:48:01 2018 Return-Path: <[email protected]> X-Original-To: root Delivered-To: [email protected] Subject: Output from your job 1 To: [email protected] Date: Sat, 10 Mar 2018 20:48:01 +0800 (CST) From: [email protected] (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
2.1 batch命令
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) 郵件發送給當前用戶;
那麽文件格式大體從以上的框架中進行了解,那麽接下來我們如何指定時間點。
3.1 時間表示法
對於用戶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 * * * *:每五分鐘執行一次某任務;
3.2 crontab命令
如果某個用戶想定義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時,如果命令需要用到%,需要對其轉義;但放置於單引號中的%不用轉義亦可;
2018-3-10Linux系統管理(9)任務計劃