任務計劃

1、任務計劃

  Linux任務計劃是週期性任務執行,在特定的時間內去安排作一些事情,這樣一種事件咱們就稱之爲任務計劃,就像人設置的鬧鐘同樣,天天定時定點的會響叫醒人,
  Linux任務計劃的分類:
    一次性的任務計劃:只執行一次就結束
    at命令就是傳夢用來處理一次性的計劃任務,
    batch:系統自行選擇空閒時間去執行此處指定的任務
   週期性的任務計劃:每隔必定的週期去作相同的事情shell

2、AT命令

  at 命令可用於建立任務計劃,或查看任務計劃。at是有atd服務提供的,須要啓動才能實現at 任務,在centos6上可使用service atd start 來啓動服務,centos7上要使用systemctl start atd.service來啓動服務。vim

 一、at命令的使用方法:

   at [選項] TIME
     選項:
      -V :顯示所安裝的at包的版本信息
      -v:可使用較明顯的時間格式列出at中的工做列表
      -l: 列出指定隊列中等待運行的做業;至關於atq
      -d: 刪除指定的做業;至關於atrm
      -c: 查看具體做業任務
      -f /path/from/somefile:從指定的文件中讀取任務,通常爲已編寫好的腳本,在某一刻運行該腳本,把任務機會的內容編寫在腳本中
      -m:當任務被完成以後,將給用戶發送郵件,即便沒有標準輸出
     TIME:
      TIME指任務執行的時間,何時執行這個任務,TIME有一下幾種格式:
        HH:MM 如:20:20 下午8點20分
         在今天的HH:MM時刻進行,若該時刻已超過當時時間,則會在明天的HH:MM進行此工做。(24小時制)
        HH:MM YYYY-MM-DD 如:20:20 2019-01-01 2019年1月1日下午8點20分
         強制規定在某年某月的某一天的特殊時刻進行該工做(24小時制)
        HH:MM[am|pm] [Month] [DATE]\ 如:04pm March 17 3月17日下午4點
         強制某年某月某日的某時刻執行(12小時制)
        HH:MM[am|pm]+number[minutes|hours|days|weeks] 如:now +5minutes或者04pm + 3 days
         指某個時間點再加幾個時間後才進行。centos

     注意:做業執行命令的結果中的標準輸出和錯誤以郵件通知給相關用戶
      例:服務器

      1.建立一個at任務計劃

       方法一:
任務計劃
       方法二:
任務計劃app

      2.查看全部的at計劃任務

任務計劃

      3.刪除一個任務計劃

任務計劃

 二、查看at隊列中有哪些at任務計劃

   atq :查看當前全部還未執行的任務計劃
   at -c # :查看at隊列中指定序號#的任務計劃的內容,ide

 三、at的執行方式:

   1)交互式,2)輸入重定向,3)at -f 文件
    at隊列存放在/var/at.{deny,allow}
     allow 白名單:/etc/at.allow 默認存在,拒絕該文件中用戶執行at命令
     deny黑名單:/etc/at.deny默認存在,拒絕該文件用戶執行at命令,而沒有在at.deny文件中的使用者則可執行
    若是兩個文件都不存在,只有root能夠執行at命令
    編輯白名單和黑明這兩個文件的方法是直接在文件中寫入用戶名便可工具

 四、移除at任務

   若是發現一個at任務計劃有問題,須要更改,怎麼處理呢?可使用atrm命令刪除
    atrm # :刪除一個at任務 測試

3、週期性任務計劃cron

   相關的程序包:
     cronie: 主程序包,提供crond守護進程及相關輔助工具cronie-anacron:    cronie的補充程序,用於監控cronie任 務執行情況,如cronie中的任務在過去該運行的時間點未能正常 運行,則anacron會隨後啓動一次此任務
    crontabs:包含CentOS提供系統維護任務ui

 一、crontab是由crond服務提供的,centos6中可使用service crond start來啓動crond服務,在centos7中要使用systemctl restart crond.crond來啓動服務

 二、計劃週期性執行的任務提交給crond,到指定的時間會自動運行

 三、cron任務有兩類:系統cron和用戶cron。系統任務是指系統級別的例行性任務計劃,系統級別的cron制定經過編輯其配置文件/etc/crontab來實現

任務計劃
  其中:
   五個*表示對應的時間點
   user-name:用戶身份;執行任務的用戶的用戶名
   command to be executd:要運行的任務;能夠是命令,能夠是腳本文件
  注意:建議在定義cron任務是,所用到的命令使用絕對路徑;若是是腳本,腳本中的命令使用絕對路徑,或自定義一個擁有完整路徑的環境變量,由於如上圖所示第二行:PATH=/sbin:/bin:/usr/sbin:/usr/bin 。該腳本中的PATH僅有這幾個路徑。而在終端上的環境變量PATH確實有更多路徑例圖:
任務計劃
  因此,若是不輸入命令的所有絕對路徑,那就極可能有些命令會超出本文件中的路徑範圍,是的命令不能正常執行從而致使出錯,腳本中的命令也是要絕對路徑url

 四、時間表示

   五個*時間點分別是
   分鐘 小時 天 月 周幾
  相關時間的表示方法,如:
   0 0 1 1 * :每一年一月一日0點0分執行一次
   20 20 20 * * :每個月20號20點20分執行一次
   20 20 * * *:天天的20點20 分執行一次
   3 * * * *:每小時3分的時候執行一次
   * * * * * :每分鐘執行一次
   20 20 * * 3:每週3的20點20分執行一次
  時間表示法:
   1)特定值
    給出時間點有效取值範圍內的值(秒不能超過60,小時不能超過24小時)
   2)*
     每...
   3)離散取值(同一個時間點給出多個值,能夠是不連續的)
     #,#,#
   4)連續取值(連續的時間值內)
    #-#
   5)在指定時間範圍上定義步長(每隔多長時間執行一次)
    */#
      例: */10 * * * * 每隔十分鐘執行一次
   6)特殊的時間表示格式
    @reboot Ronce after reboot.(重啓以後)
    @yearly    0 0 1 1 *
    @annually   0 0 1 1 *
    @monthly    0 0 1 * *
    @weekly    0 0 * * 0
    @daily     0 0 * * *
    @hourly     0 * * * *

 五、示例

  每分鐘以root的身份執行一次/app/sh/qipan.sh這個腳本
任務計劃
  每小時的10分20分30分時,以root的身份執行ls /app 這個命令
任務計劃
  天天隔10隔小時10分的時候執行wall a
任務計劃

 六、對於命令的執行結果

   對於人物運行的後果,默認郵件發送給任務相關的用戶,固然也能夠丟棄郵件,輸出重定向:
    cmd >/dev/null
   cmd \>& /dev/null
   cmd \> /dev/null 2\>&1

 七、用戶級的計劃任務

    用戶級別的計劃任務經過crontab命令來實現的,其也有對應的配置文件在/var/spool/cron/目錄中,

 八、命令建立用戶級別的計劃任務命令crontab

   crontab 命令:
    -l:累出已定義好的的全部任務
    -e:打開編輯界面定義任務(會直接進入文件/tmp下以crontab.開頭的隨機文件中中,一行編輯一個任務計劃,而後保存退出,就會自動將計劃任務添加至/var/spool/cron/USERNAME中去,每一個用戶都有專用cron任務文件以本身的用戶名爲名保存在/var/spool/cron目錄中)
    -r:remove,移除全部任務
    -i:同-r 一同使用,以交互式模式移除指定任務
   注意:刪除一個任務應該經過-e選項進入編輯界面刪除行實現,
   使用crontab命令設置用戶級別計劃任務的格式跟系統級計劃任務的任務格式差很少,格式爲: * cmd 。只是少了執行者的用戶名
   以上針對的是當前用戶的任務計劃信息,固然咱們還能夠針對其餘指定用戶的任務計劃操做,使用-u username ,所支持的選項如上。(僅root能夠運行,指定用戶管理cron任務)
crontab 也能夠不加任何選項,在這種狀況下不會進入編輯界面可是會進入一個臨時編輯任務的界面,能夠輸入一行任務計劃而後按Ctrl+d保存退出,這個計劃任務就會自動寫入編輯界面的文件中去,可是有一個缺點,就是會覆蓋文件使其以前編輯的任務所有消失,只剩下這一條,並且在這種狀況下一次只能編寫一條計劃任務,如多編輯多條則只有最後一條會生效。可是使用-e選項就不一樣了,能夠一次性編輯多條計劃任務,且每一條都會生效。
   例:使用crontab命令在臨時界面建立一個任務,而後在使用-l選項查詢一下
任務計劃
   若是crontab中的命令中須要使用%時,須要對其進行轉義,轉義符號是「\」,或將%放置於單引號中則可不用轉義如上圖中所示。
    控制用戶執行計劃任務的文件
     /etc/cron.{allow|deny}

 九、練習:

  1.沒4個小時執行一次對/etc目錄的備份,備份至/backkup中,保存的目錄名爲etc-後面跟當時的時間;如:etc-201804050202

任務計劃
   而後保存退出就能夠了

  2.編寫兩個腳本/app/sh/naozhong.sh和/app/sh/xingle.sh,使其天天早上8點自動執行腳本/app/sh/naozhong.sh叫我起牀,而後在8點05分時在執行/app/sh/xingle腳本把/app/sh/naozhong 給自動停了。

先變寫/app/sh/naozhong.sh腳本
任務計劃
再編寫/app/sh/xingle.sh腳本
任務計劃
最後建立這兩個計劃任務
任務計劃

 十、如何在秒級別運行任務

    * * * * * for min in 0 1 2; do echo "hi"; sleep 20; done

 十一、如何實現每隔多長時間運行一次任務

   sleep 命令:
     sleep #[時間單位]
      時間單位:
       s:秒,(默認)
       m:分
       h:小時
       d:天

4、anacron系統

  生產環境中的Linux主機,一般都是全天、整年無休止的工做,一樣在其之上制定的任務計劃也是須要天天、每週、固定時間去執行,若是沒有什麼意外狀況(譬如:斷電),那任務就會按照設定的時間去執行,可是若是在某一週期內系統發生的斷電狀況,在恢復供電期間正好有一些計劃任務去執行,此時任務計劃就失效了,當恢復供電以後,系統須要等到下一週期才能繼續執行此任務,也就意味着斷電期間的任務將失效。但偏偏在這期間要執行的任務也很是重要,該怎麼辦呢?只能手動去執行了,這...沒有自動去執行的方法嗎?有!那就是anacron
  anacron並非用來取代crontab的,anacron存在的目的就在於咱們上面提到的,解決一些非24小時在線的Linux系統上的crontab沒法正常運行的問題。Anacron並不能指定什麼時候運行某項任務,而是以天爲單位或者在啓動後當即進行anacron動做,他會去檢測停機期間應該進行可是並無進行的crontab任務,並將該任務運行一遍後,anacron就會自動中止了
  因爲anacron會以一天、一週、一個月爲週期去檢測系統未進行的crontab任務,所以對於某些特殊的使用環境很是有幫助,所以當你的Linux主機斷電時,可能存在許多crontab的任務沒法進行,anacron恰好能夠解決這個問題。如:筆記本電腦、臺式機、工做站、偶爾要關機的服務器及其它不一直開機的系統很重要頗有用
  那麼anacron如何知道Linux系統是什麼時候關機的呢?Anacron會記錄上一次anacron執行的時間,anacron會去分析如今的時間與記錄上次運行的時間,二者比較後若發現有差別,那就是某些時刻沒有進行計劃任務了,此時anacron就會開始運行未進行的crontab任務,因此其實anacron也是經過crontab來運行的
  anacron是一個程序,而不是一個服務,anacron也有本身的配置文件,語氣相關的配置文件有:
   配置文件:/etc/anacrontab
   負責執行如下幾個文件中的系統任務:/etc/cron.daily
                    /etc/cron.weekly
                    /etc/cron.monthly
   由/ec/cron.hourly/Oanncron執行
   當執行任務時,更新/var/spool/anacron/cron.daily文件的時間戳

 一、配置文件

  先來看一下配置文件中的內容
任務計劃
  這個文件中設置了要監管哪些文件中的系統任務,使在那些文件中系統任務即便關機沒有正常執行的系統任務在開機後也會依舊執行,
  配置文件的編寫格式
   Period in days:這是任務的頻率,以天來指定,或者是@daily、@weekly、@monthly表明天天、每週、每個月一次,你也可使用數字:1表明天天;7表明每週;30表明每個月
   Delay in mminutes:這是在執行一個任務前等待的時間,單位是分鐘。
   Job-identifier:這是卸載日誌文件中任務的獨特名字
   Command:這是執行任務的命令或shell腳本,或者是文件,文件裏面包含一些系統任務

 二、anacron的執行流程

  Anacron會檢查任務是否已經在period字段指定的時間被執行了。若是沒有,則在等待delay字段中指定的分鐘數後,執行cmmand字段中指定的命令,一旦任務唄執行了,它會使用job-identifier(時間戳文件名)字段中指定的名稱將日期記錄在/var/spool/anacron目錄中的時間戳文件中。

 三、管理臨時文件

  1.Centos6使用/etc/cron.daily/tmpwatch定時清除臨時文件

   tmpwatch工具從指定的目錄中遞歸地搜索,並刪除在指定時間段內沒有被訪問的文件。tmpwatch通常被用來清掃那些用來臨時駐留文件的目錄,(譬如:/tmp)tmpwatch忽略符號連接,它不會切換文件系統,並且只刪除空目錄和常規文件

   1)語法:

     tmpwatch [短選項] [長選項] [超期時間] [目錄...]
      選項:
       -a或- -all :刪除任何類型的文件
       -f或- -force :強制刪除文件或目錄,其效果相似rm指令的「-f」參數
       -q或- -quite :不顯示執行執行過程
       -v或- -verbose :詳細的顯示指令執行過程
       -test :僅測試,並非真的刪除文件或目錄

  2.Centos7使用systemd-tmpfiles-setup服務實現

   配置文件: /etc/tmpfiles.d/*.conf
         /run/tmpfiles.d/*.conf
         /usr/lib/tmpfiles/*.conf
   查看一下系統臨時文件的配置文件/usr/lib/tmpfiles.d/tmp.conf
任務計劃

   1)臨時文件的配置文件格式

     文件類型   文件名  權限   所屬人  所屬組   文件的存在時間
      v      /tmp   1777   root     root     10d
    文件名就是保存臨時文件的目錄
     關於文件存在時間的設定就是在該時間內文件不能被刪除,超過那個時間才能夠被刪除,單位s/秒;h/小時;d/天

   2)命令systemd-tmpfiles

    systemd-tmpfiles --create /usr/lib/tmpfiles.d/*.conf :執行臨時文件的配置
    systemd-tmpfiles --clean /usr/lib/tmpfiles.d/*conf :清理該配置文件中超過文&件存在時間的臨時文件
    systemd-tmpfiles --remove /usr/lib/tmpfiles.d/*conf:刪除配置文件中全部的臨時文件

5、計劃任務Reboot的解決方法

  還有一種狀況就是在編輯計劃任務的時候,設置了一條在重啓以後重啓的計劃任務怎麼辦解決,由於若是這樣,重啓以後就會執行計劃任務從新啓動,啓動成功後又執行計劃任務從新啓動,將會進入無窮無盡的重啓使其開不開機,在這種狀況下,咱們將怎麼辦呢?
   如:@reboot root /bin/reboot
   別急還有有辦法的,以下:
  Centos 7:

  1.重啓以後,進入grub,在Linux16這一行的行未加上空格rd.break;按Ctrl+x

  2.mount -o remount,rw/sysroot

  3.vi /sysroot/etc/crontab刪除文件中那一行計劃任務重啓便可

  Centos 6:

  1.進入grub:在kernel這一行最後加空格1;先esc回到主界面,再按b啓動

  2.vim /etc/crontab

相關文章
相關標籤/搜索