2018-3-10Linux系統管理(9)任務計劃

在這一章當中咱們講述Linux任務計劃以及週期性任務的執行。node

1、任務計劃

  咱們此前說過一些備份的知識,假如在某種場景當中須要作備份,例如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

1.1 mailx命令

  爲了能查看任務往來的通訊結果及狀況,咱們須要前提掌握關於郵件的收發命令,不然沒法判斷該任務計劃到底執行與否,因此咱們來查看本地電子郵件服務。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) 經過管道;

  那麼咱們接下來說述一下週期性任務,以及講述一下在將來的某一個時刻執行一次某種任務。

2、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 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

2.1 batch命令

  batch和at命令是同樣的,但二者不一樣之處在於batch命令不像at命令同樣,指定做業在某個時間運行,而是讓系統自行選擇,在系統較爲空閒的時間去執行指定的任務。也就是說,不用指定時間了,但其它的使用方法與at命令基本相同。

3、週期性任務

  週期性任務計劃採用的是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時,若是命令須要用到%,須要對其轉義;但放置於單引號中的%不用轉義亦可;
相關文章
相關標籤/搜索