1. 程式人生 > >2018-3-10Linux系統管理(9)任務計劃

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

Linux 系統管理

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

一、任務計劃

我們此前說過一些備份的知識,假如在某種場景當中需要做備份,例如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)任務計劃