天天看點

Linux計劃任務at&batch&crontab

計劃任務

        執行一次某任務:at,batch

        周期性運作某任務:crontab    

1.at指令,隻執行一次 at/atq/atrm/batch

    at [option]... time

        HH:MM[YYYY-mm-dd] //

        noon,midnight,teatime //12:00,24:00,16:00

        tomorrow HH:MM 

        now+#

            UNIT:minutest,hours,days,weeks

        -l 列出任務 //相當于atq

        -f 從指定檔案中讀取任務,而非互動式輸入

        -d job_number 删除,相當于atrm

        -c //檢視工作内容

            at -c 8 //檢視作業内容,目前使用者登出後,當然也會執行,at -c 會顯示所有的環境

        -q 指明隊列

    錯誤:Can't open /var/run/atd.pid to signal atd. No atd running?

            service atd on 

            chkconfig atd on //開機啟動即可

    at 1+min // ctrl +d送出

    at的作業有隊列,用單個字母表示,預設都是用a隊列

    at -f b.task now+2min  

    注釋:作業執行結果是以郵件發給送出作業的使用者

    注意:at的環境可能和登入終端的環境不同,可能需要指定指令的全路徑

    注意:先at.allow,後at.deny,一個使用者占用一行,不允許有空格

        /etc/at.allow  

        /etc/at.deny

2.batch //讓系統自行選擇在空閑時間去執行指定任務,不需要再指定時間

3.crontab    

    /etc/cron.allow

    /etc/cron.deny

    服務程式:

        cronle:主程式包

        service crond [start|reload|stop|restart]

    確定crond守護程序(daemon)處于運作狀态

        systemctl status crond.service 

        service crond status 

    crontab 任務分為兩類:

        系統級别任務:主要用于系統自身的維護 //例如自動清除臨時檔案

            手動編輯:/etc/crontab 檔案

        使用者cron任務:

            /var/spool/cron/USERNAME 同名檔案

            指令:crontab 指令

            分  時  天 月 周 command

                周:sun,mon,tue,wed,thu,fri,sat /或者0-6

    系統級别:[root@mt test]# 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 execute    

        1.每一行定義一個周期性任務,共7個字段

        2.user-name 運作任務的使用者身份,使用者級别不需要

        3.執行結果郵件發送給指定使用者

        # *  *  *  *  *   command to be execute    

        1.每一行定義一個周期性任務,共6個字段

        2.此處的環境變量不同于登陸後獲得的環境,是以,建議使用指令絕對路徑,或者自定義path變量

        3.執行結果郵件發送給目前使用者    

4.時間表示法

    1)周 和 日 建議和日隻使用一個,不同時使用

    2)* 給定時間點上,有效取值範圍内的所有值

    3)離散取值

        逗号分開的多個值:#,#,#

        9 8 * 3,7 //每周三,周日的8:09

        * 8,20 * 3,7 //每周三,周日的8:00和20:00 每分鐘執行一次

    4)連續取值

        #-# 

    5)在指定時間上,定義步長

        /#

        */7 * * * * //每5min執行一次

            //前幾個為每7min,第8個7 56min的時候,最後一個不執行

            //下一個小時,從0 從新開始沒7min

        注意:

            (1)指定的時間點不能被步長整除時,其意義将不複村子

            (2)最小時間為min,想完成second任務,需要借助于其他機制

                定義每分鐘任務,而在腳本中實作每分鐘之内,循環執行多次

5.crontabs

       crontab [-u user] file

       crontab [-u user] [-l | -r | -e] [-i] [-s]

       crontab -n [ hostname ]

       crontab -c

     -i 在remove之前詢問y/Y

    -e 編輯

    -r 将删除/var/spool/cron/USERNAME 的檔案

        删除單個:crontab -e 行首加#,或者删除該行

    注意:運作結果以郵件方式通知給目前使用者;如果拒絕接受郵件

        (1) COMMAND > /dev/null //隻接受錯誤的郵件

        (2) COMMAND &> /dev/null //都不接受郵件

    定義COMMAND的時候,如果指令中有%,需要轉義 \%

        或者 ' ' 單引号

6.anacron 用于恢複執行未執行的任務

    以天為機關或者是在啟動後立刻進行anacron的動作,

    它會去偵測停機期間應該進行但是并沒有進行的crontab任務,

    并将該任務運作一遍後,anacron就會自動停止了

    ll  /etc/cron*/*ana*  //來檢視anacron的偵測時間

    anacron指令的文法如下

        -s開始連續的運作各項工作,會根據時間記錄來判斷是否進行

        -f 強制執行,而不判斷時間登陸等時間戳

        -n 立即進行未進行的任務,而不延遲等待時間

        -u 僅僅更新記錄等的時間戳,不進行任何工作

        而anacron的配置檔案是/etc/anacrontab,而它的很多内容則是在/var/spool/anacron裡面儲存。

        當anacron下達anacron  -s  cron.daily時,它會有如下的步驟:

        (1)由/etc/anacrontab分析到cron.daily這項工作名稱的天數為一天。

        (2)由/var/spool/anacron/cron.daily取出最近一次運作anacron的時間戳。

        (3)把取出的時間戳與目前的時間戳相比較,如果差異超過了一天,那麼就準備進行指令。

        (4)若準備進行指令,根據/etc/anacrontab的配置,将延遲65分鐘。

        (5)延遲時間後,開始運作後續指令,也就是run-parts  /etc/cron.daily這串指令。

        (6)運作完畢後,anacron程式結束。

思考:某任務在指定的時間因關機未能執行,下次開機不會自動執行?

    不會!

    如果期望某事件因故障未能按時執行,下次開機後無論是否到了相應時間點都要執行一次,可使用anacron

注意:at和crontab都有守護程序

注意:/etc/cron.day

小結:at,batch crontab,anacron

練習

    1.每12小時備份一次/etc目錄至/backups目錄中,儲存檔案名稱格式為"etc-yyyy-mm-dd-hh.tar.xz"

        0 */12 * * * l tar Jcf /tmp/test/etc-$(date +%F-%H-%S).tar.xz /etc

    2.每周2,4,7備份/var/log/secure 檔案到/logs目錄中,檔案名格式為“secure-yyyymmdd""

        0 0 * * 2,4,7 

    3.每兩小時取出目前系統/proc/meminfo檔案中以S或M開頭的行資訊追加至/tmp/meminfo.txt

        * */2 * * *  grep "^[S|M]" /proc/meminfo  >> /tmp/meminfo.txt  //注意:目前使用者要對meminfo.txt具有寫的權限,否則permission denied

問題:

    /etc/crontab 中沒有run-parts

    如何運作/etc/cron.daily 等檔案

    檔案中run-parts部分所示,它使用 run-parts 腳本來執行存在于 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 

    cat /etc/crontab

        HOME=/

        # run-parts

        01 * * * * root run-parts /etc/cron.hourly

        02 4 * * * root run-parts /etc/cron.daily

        22 4 * * 0 root run-parts /etc/cron.weekly

        42 4 1 * * root run-parts /etc/cron.monthly

  run-parts是一個腳本檔案, 内容是很簡單的一個shell腳本,就是周遊目标檔案夾,執行第一層目錄下的可執行權限的檔案。       

本文轉自MT_IT51CTO部落格,原文連結:http://blog.51cto.com/hmtk520/1950157,如需轉載請自行聯系原作者

繼續閱讀