linu之任務計劃crontab

在運維工作中,數據備份是至關重要的事情,基本每天都要做一次備份,使用linux任務計劃來進行是最合適的。

任務計劃分爲兩種,一種是在未來某個時間點運行一次的任務,使用atbatch; 另一種是週期行的任務crontab

本地郵件服務

任務計劃的執行結果默認會通過郵件發送給用戶,這個郵件會並非是公網的郵件,而是本機用戶之間互發的本地郵件服務器,每當用戶登錄的時候,就回收到郵件的提醒,郵件一般都是放在/var/spool/mail目錄下面。

所以就先學習下怎麼在本機中收發郵件吧,花不了幾分鐘,當然直接跳過,也不影響後面的內容

centos5/6/7中郵件服務是默認開啓的,端口是25,可以使用ss -tnlnetstat -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單位的時間,UNITminuteshoursdaysweeks
-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任務分爲以下兩類:

  1. 系統任務:主要用於實現系統自身的維護,只能通過手動編輯/etc/crontab文件來實現,大部分時間下無需修改。
  2. 用戶自定義任務,使用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配置文件的特點:

  1. 每行僅定義一個週期性任務
  2. user-name表示運行此任務的用戶身份,用戶自定義的cron不需要此字段,用戶身份就是用戶本身
  3. command to be executed對應要執行的任務
  4. 此處的環境變量不同於用戶登錄後的環境變量,建議使用絕對路徑,或自定義PATH環境變量。
  5. 執行結果以郵件發送給MAILTO指定的用戶

每個任務之間的最小間隔時間單位爲分鐘,cron不支持秒級的任務,如果要使用秒級的週期性任務,需要額外借助於其他機制。

時間表示法:

  1. 給對應位上設置有效取值範圍的值,如分鐘的取值範圍是0-59

  2. *表示給定時間點上,有效取值範圍內的所有值,意思是每...

    • 3 * * * * 表示每個小時的第三分鐘執行一次
    • 3 4 * * 5 表示每個週五的四點三分執行一次
    • 5 6 7 * * 表示每個7號的六點五分執行一次
    • 7 8 9 10 * 表示每個10月9號八點七分執行一次
  3. 離散取值,在時間點上用逗號分割的多個值,#,#,#

    9 8 * * 3,7 : 每週三和週日的八點九分

    0 8,,20 * * 3,7 每週三和週日的八點和二十點

  4. 連續取值,在時間點上使用-連接開頭和結束,#-#

    0 9-18 * * 1-5 : 每個週一到週五的九點到18點的每個小時都執行一次

  5. 在指定時間點上定義步長,*/#,需要注意的是在指定時間點上,不能被步長整除時,則週期任務的意義不復存在,只有能夠被整除的步長值才能表達與我們理解相一致確切的含義,對於分鐘來說只有 */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 任務無論成功還是失敗,都不用發送郵件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章