在運維工作中,數據備份是至關重要的事情,基本每天都要做一次備份,使用linux
任務計劃來進行是最合適的。
任務計劃分爲兩種,一種是在未來某個時間點運行一次的任務,使用at
、batch
; 另一種是週期行的任務crontab
。
本地郵件服務
任務計劃的執行結果默認會通過郵件發送給用戶,這個郵件會並非是公網的郵件,而是本機用戶之間互發的本地郵件服務器,每當用戶登錄的時候,就回收到郵件的提醒,郵件一般都是放在/var/spool/mail
目錄下面。
所以就先學習下怎麼在本機中收發郵件吧,花不了幾分鐘,當然直接跳過,也不影響後面的內容
在centos5/6/7
中郵件服務是默認開啓的,端口是25
,可以使用ss -tnl
、netstat -tnl
或者netstat -tnpl
來查看。
mail
用於收發郵件的命令,是一個用戶郵件代理mail user agent
,幫助用戶實現郵件收發的命令工具,功能類似web
郵件客戶端、foxmail
等這種。
使用格式: mail [-s "subject"] username[@localhost]
mail
命令不帶任何參數時,表示收郵件,然後輸入郵件的編號,就可以看到郵件的內容,
[vagrant@nexus3 ~]$ mail -s "test subject" user2 # 發送一封郵件給用戶 user2
How are you , user2
. # 單獨一行,前後沒有空格的點好表示郵件寫完了,回車後就回自動發送
EOT
[vagrant@nexus3 ~]$ su - user2 # 切換到 user2 , 查看郵件
Password:
Last login: 日 6月 14 04:03:06 UTC 2020 on pts/1
[user2@nexus3 ~]$ mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/user2": 1 message 1 new # 可以看到有一封未讀郵件
>N 1 vagrant Mon Jun 22 16:19 18/619 "test subject"
& 1 # 輸入編號 1 ,查看郵件
Message 1:
From [email protected] Mon Jun 22 16:19:41 2020
Return-Path: <[email protected]>
X-Original-To: user2
Delivered-To: [email protected]
Date: Mon, 22 Jun 2020 16:19:41 +0000
To: [email protected]
Subject: test subject
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: [email protected] (vagrant)
Status: R
How are you , user2
& q # 輸入 q 退出
Held 1 message in /var/spool/mail/user2
直接在命令行裏編輯郵件比較不方便,還可以通過其他的兩種方式來發送郵件。
- 使用輸入重定向:
mail -s "fstab" user2 < /etc/fstab
- 使用管道 :
cat /etc/fstab | mail -s "to user2" user2
at
前面說過,at
用來設定在未來某個時間點運行一次的任務,at
的作業有隊列的概念,隊列用單個字符表示,默認都是使用a
隊列。
命令格式: at [option] TIME
,輸入命令後,終端會等待輸入要執行作業的具體內容,Ctrl+d
可以終止輸入並提交。
選項 | 作用 |
---|---|
TIME | noon: 中午十二點 midnight:午夜零點 teatime:下午四點,即十六點 HH:MM [YYYY-mm-dd] : 指定日期的時間點HH:MM tomorrow : 明天的指定時間點now+#UNIT : 當前時間往前# 個UNIT 單位的時間,UNIT 有minutes 、hours 、days 和weeks |
-l | 列出所有待執行的作業列表 |
-f | 從指定的文件中讀取作業任務,而不用交互式輸入 |
-d # | 刪除指定編號# 的作業任務,等同於命令atrm |
-c # | 查看指定編號任務的具體內容 |
-q QUEUE | 查看指定隊列的任務 |
[vagrant@nexus3 ~]$ at now+3minutes
at> ls -l
at> echo "可以的"
at> <EOT>
job 5 at Mon Jun 22 17:07:00 2020
[vagrant@nexus3 ~]$ at -l
5 Mon Jun 22 17:07:00 2020 a vagrant
[vagrant@nexus3 ~]$ at teatime
at> echo "teatime"
at> <EOT>
job 6 at Tue Jun 23 16:00:00 2020
[vagrant@nexus3 ~]$ at -l
5 Mon Jun 22 17:07:00 2020 a vagrant # 5是作業編號 , a 是默認隊列 ,vagrant表示執行用戶
6 Tue Jun 23 16:00:00 2020 a vagrant
[vagrant@nexus3 ~]$ at -d 6
[vagrant@nexus3 ~]$ at -l
5 Mon Jun 22 17:07:00 2020 a vagrant
batch
batch
命令跟at
是一樣的,唯一的區別在於batch
會讓系統自行選擇,資源較空閒的時候去執行指定的任務。
週期性任務計劃cron
爲了保證週期性的任務可以按照指定的時間執行,會有一個專門的服務一直在監控時間是否滿足執行條件。
程序包cronle
提供了crond
守護進程及相關服務中工具,首先來確認下crond
守護進程(daemon)是否處於運行狀態。
centos7
使用systemctl status crond
來查看crond
守護進程的狀態。
centos5/6
使用service crond status
來查看crond
守護進程的狀態。
cron
任務分爲以下兩類:
- 系統任務:主要用於實現系統自身的維護,只能通過手動編輯
/etc/crontab
文件來實現,大部分時間下無需修改。 - 用戶自定義任務,使用
crontab
命令來實現,配置文件保存在/var/spool/cron/USERNAME
文件, 每個用戶都擁有一個單獨的配置文件,格式和系統任務相同。
[vagrant@nexus3 ~]$ 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
cron
配置文件的特點:
- 每行僅定義一個週期性任務
user-name
表示運行此任務的用戶身份,用戶自定義的cron
不需要此字段,用戶身份就是用戶本身command to be executed
對應要執行的任務- 此處的環境變量不同於用戶登錄後的環境變量,建議使用絕對路徑,或自定義
PATH
環境變量。 - 執行結果以郵件發送給
MAILTO
指定的用戶
每個任務之間的最小間隔時間單位爲分鐘,
cron
不支持秒級的任務,如果要使用秒級的週期性任務,需要額外借助於其他機制。
時間表示法:
-
給對應位上設置有效取值範圍的值,如分鐘的取值範圍是
0-59
-
*
表示給定時間點上,有效取值範圍內的所有值,意思是每...
3 * * * *
表示每個小時的第三分鐘執行一次3 4 * * 5
表示每個週五的四點三分執行一次5 6 7 * *
表示每個7號的六點五分執行一次7 8 9 10 *
表示每個10月9號八點七分執行一次
-
離散取值,在時間點上用逗號分割的多個值,
#,#,#
9 8 * * 3,7
: 每週三和週日的八點九分0 8,,20 * * 3,7
每週三和週日的八點和二十點 -
連續取值,在時間點上使用
-
連接開頭和結束,#-#
0 9-18 * * 1-5
: 每個週一到週五的九點到18點的每個小時都執行一次 -
在指定時間點上定義步長,
*/#
,需要注意的是在指定時間點上,不能被步長整除時,則週期任務的意義不復存在,只有能夠被整除的步長值才能表達與我們理解相一致確切的含義,對於分鐘來說只有*/2,*/3,*/4,*/5,*/6,*/10,*/12,*/15,*/30
,對於小時來說則只有*/2,*/3,*/4,*/6,*/8,*/12
。對於日期來說,如果使用*/5
,則不能保證每5天執行一次,到月底的時候可能只執行1天、2天或3天后就停止了,這取決與大小月與平閏年。這是因爲 cron 是沒有狀態的,它不能夠記錄上次執行的是什麼時間,只能根據當前的時間來判斷是否需要執行。而對於
*/13 * * * *
這個例子來說,表示在分鐘這個範圍內,即0-59分鐘,任務會每13分鐘執行一次。即:0,13,26,39,52,之後再間隔8分鐘,就會又重新執行。再看下面一個例子:
0 6 */2 * * /command
,如果理解成每兩天的6點鐘執行命令。在這裏*
的範圍是1-31
,*/2
表示任務在奇數天執行,那麼在1、3、5、7、8、10、12月,月末最後一天執行後,緊接着第二天仍然後執行,那這就不是每2天執行一次。
crontab 命令
命令格式crontab [-u username] [-l | -r | -e ] [-i] [-s]
選項 | 作用 |
---|---|
-e | 編輯任務,自帶語法檢查 |
-l | 列出所有任務 |
-r | 移除全部任務,即刪除/etc/spool/cron/URERNAME 文件 |
-i | 在使用-r 移除全部任務的時候,給出提示確認操作 |
-u USERNAME | root 可以爲指定用戶管理cron |
如果要刪除某一個任務,直接使用-e
,在編輯中刪除即可。
如果想拒收郵件,可以使用如下操作:
- COMMAND > /dev/null 執行失敗發送郵件,成功就不用發送了
- COMMAND &> /dev/null 任務無論成功還是失敗,都不用發送郵件