1. 程式人生 > >計劃任務及其相關命令

計劃任務及其相關命令

電腦 即使 它的 crontab 開機 優先級 執行 options 周期

Linux 計劃任務的分類:

     一次性任何計劃:
        未來的某時間點執行一次任務
        at:專門用來處理一次性任務計劃
        batch :系統自行選擇空閑時間去執行此處指定的任務
    周期性的任務計劃:
        周期性運行某任務
        crontab :可以根據定義的周期信息,循環的去做些事情

at 計劃任務

    at 是由atd服務提供的,依賴與atd 服務, 需要啟動才能實現at 任務
        在centos6上可以用service atd start來啟動服務
        在centos7上要使用systemctl start atd.service 來啟動服務
        使用的命令:at
    執行方式:
        1)交互式 
        2)輸入重定向 
        3)at –f 文件
        
    at 隊列存放在/var/spool/at 目錄中
    
    /etc/at.{allow,deny} 控制用戶是否能執行at任務
        白名單:
            /etc/at.allow 默認不存在,只有該文件中的用戶才能執行at 命令
            有了白名單,就不看黑名單了。
        黑名單:
            /etc/at.deny 默認存在,拒絕該文件中用戶執行at命令,
             而沒有在at.deny  文件中的使用者則可執行
        如果兩個文件都不存在,只有root可以執行at命令
    at命令
        at, batch, atq, atrm - queue, examine or delete jobs for later execution
            at,用於在指定時間點執行命令
            atq,列出用戶的待做任務,除了超級用戶root
            atrm,刪除任務,通過工作編碼來識別
            batch,當負載平衡水平掉到0.8後執行命令
        at [-V] [-q x] [-f file] [-mMlbv] timespec ...
        at [-V] [-q x] [-f file] [-mMlbv] -t time
        at -c job ...
        at [ -rd ] job ...
        atq [-V] [-q x]
        atrm [-V] job ...
        batch
            -v: 可以使用較為明顯的時間格式列出at中的工作列表
            -l:     列出目前系統上面所用當前用戶的at隊列,相當於atq
            -d:     可以取消一個在at排程中的工作,刪除指定的作業;相當於atrm
            -c:     查看具體作業任務。也就是查看/var/spool/at 目錄下對應的內容
            -f /path/from/somefile :    把at要執行的所有任務放置在文件中,讓at讀取此文件作為要運行的任務。
            -m:     當任務被完成之後,將給用戶發送郵件,即使沒有標準輸出
            ctrl  + d  或者 ctrl +\   來正常執行退出
            ctrl + c    來取消這次任務
            -q queue    使用指定的隊列
            -M  不發送郵件給用戶
            -t time 在time時間運行任務,格式為[[CC]YY]MMDDhhmm[.ss]
            -r  相當於atrm
            -b  相當於batch
        at讀取標準輸入stdin,所以可以用標準重定向的各種方法來進行at的讀取設置
        註意:
            作業執行命令的結果中的標準輸出和錯誤以郵件通知給相關用戶
        TIME: 
            定義出什麽時候進行 at 這項任務的時間
            HH:MM
            HH:MM [YYYY-mm-dd]
            HH:MM [am|pm] [Month] [Date]
            HH:MM [am|pm] + number[minutes|hours|days|weeks]
            noon(中午12點), midnight, teatime(4pm) 
            tomorrow
            now+#{minutes,hours,days, OR weeks}
        HH:MM 
            02:00
            在今日的 HH:MM 進行,若該時刻已過,則明天此時執行任務
        HH:MM YYYY-MM-DD
            02:00 2016-09-20
            規定在某年某月的某一天的特殊時刻進行該項任務
        HH:MM[am|pm] [Month] [Date]
            04pm March 17
            17:20 tomorrow
        HH:MM[am|pm] + number [minutes|hours|days|weeks]
            在某個時間點再加幾個時間後才進行該項任務
            now + 5 minutes
            02pm + 3 days
            

cront計劃任務

    crontab是由crond服務提供的
        centos6中可以使用service crond start 來啟動crond 服務,
        centos7中要使用systemctl restart crond.service 來啟動服務。
        使用命令:crontab,crond
    程序包:
        cronie:
            主程序包,提供crond守護進程及相關輔助工具
        cronie-anacron :
            cronie 的補充程序,用於監控cronie任務執行狀況,
            如cronie中的任務在過去該運行的時間點未能正常運行,則anacron 會隨後啟動一次此任務
        crontabs :
            包含CentOS提供系統維護任務
    確保crond 守護處於運行狀態:
            systemctl status crond
            service crond status
    計劃周期性執行的任務提交給crond,到指定時間會自動運行
        系統cron任務:
            系統級別的例行性任務計劃,它的制定是通過編輯以下配置文件來實現
            /etc/crontab
        用戶cron任務:
            crontab 命令定義
            每個用戶都有專用的cron任務文件
                /var/spool/cron/USERNAME
        日誌路徑:
            /var/log/cron
    系統cron任務文件/etc/crontab的用法
        詳情參見 man 4 crontab
            # 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
            
            @reboot run once 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 * * * *
            前面5個*表示對應的時間點
            user-name:用戶身份
            command:要運行的任務
            註意:
                建議在定義cron任務時,所用到命令使用絕對路徑;如果是腳本,腳本中的命令使用絕對路徑,或自定義一個擁有完整路徑的環境變量
                對於cron任務來講,% 有特殊用途,如果在命令中要使用%,則需要轉義‘\’,或將% 放置於單引號中,則可不用轉義。
        時間表示法:
            特定值
                給定時間點有效取值範圍內的值
            *
                給定時間點上有效取值範圍內的所有值
                表示“每...”
            離散取值
                #,#,#
            連續取值
                #-#
            在指定時間範圍上,定義步長
                */#: #即為步長,每#個時間單位一次
        時間格式
            從左往右,第一個*點出現的位置就是按照這個對應的時間點進行計算。
                @reboot run once 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 * * * *
                0 ***** :
        系統的計劃任務
            /etc/crontab
            /etc/cron.d/     ##配置文件
            /etc/cron.hourly/    ##腳本
            /etc/cron.daily/
            /etc/cron.weekly/  
            /etc/cron.monthly/
        控制用戶執行計劃任務
            /etc/cron.{allow,deny}
            allow的優先級高於deny,不被放到allow裏面,就沒有權限使用crontab。
            當allow和deny都沒有時,只有root用戶有權限使用crontab
        
        示例:
            晚上9點10分運行echo 命令
                10 21 * * * centos /bin/echo "Howdy!"
            每3小時echo 和wall 命令
                0 */3 * * * centos /bin/echo “howdy”;/usr/bin/wall “welcome to Magedu!”
        思考:
            如何在秒級別運行任務?
                * * * * * for min in 0 1 2; do echo "hi"; sleep 20;done
            如何實現每7分鐘運行一次任務?
            
    crontab命令
        crontab - maintains crontab files for individual users
        crontab [options] file
        crontab [options]
        crontab -n [hostname]
            -u <user>   定義用戶
            -e          編輯用戶crontab任務
            -l          列出用戶crontab任務
            -r          刪除用戶的
            -i          在刪除之前進行提示
            -n <host>   在集群中設置主機來運行用戶的crontab任務
            -c          在集群中獲取主機來運行crontab任務
            -s          selinux 內容上下文
            -x <mask>   激活詳情
        註意:
            若需要刪除一個任務,則需要通過編輯界面刪除行實現
        

at和crontab的對比

    用一次性作業使用 at,重復性作業使用crontab
    root用戶能夠修改其它用戶的作業
    Create      at time     crontab -e
    List    at -l   crontab -l
    Details     at -c   jobnum N/A
    Remove      at -d   jobnum crontab -r
    Edit    N/A     crontab -e

運行結果的重定向

    沒有被重定向的輸出會被郵寄給用戶,運行結果的標準輸出和錯誤以郵件通知給相關用戶
    重定向:
        COMMAND > /dev/null
        COMMAND &> /dev/null
        COMMAND >/dev/null  2>&1
        /dev/null:軟件模擬的設備,bit bucket,數據黑洞。

anacron系統

    anacron處理斷電期間沒能執行的cron任務,anacron並不是用來取代crontab。
    anacron解決一些非24小時在線的linux系統上的crontab無法正常運行的問題。
    anacron並不能指定何時運行某項任務,而是以天為單位或在啟動後立刻進行anacron的動作,它會檢查停機期間應該進行但並沒有進行的crontab任務,並將該任務運行一遍後,anacron就會自動停止。
    anacron會記錄上次anacron執行的時間,anacron會去分析現在的時間與記錄上次運行anacron的時間,再次比較後若發現有差異,那就在某些時刻沒有進行計劃任務了,此時anacron就會開始運行未進行的crontab任務,所以anacron其實也是通過crontab來運行的。
    anacron是一個程序,而非一個服務。
        運行計算機關機時cron不運行的任務,CentOS6 以後版本取消anacron服務,由crond服務管理
        對筆記本電腦、臺式機、工作站、偶爾要關機的服務器及其它不一直開機的系統很重要很有用
    配置文件:
        /etc/anacrontab ,負責執行/etc/ cron.daily、/etc/cron.weekly、/etc/cron.monthly 中系統任務。
        字段1 :如果在這些日子裏沒有運行這些任務……
        字段2 :在重新引導後等待這麽多分鐘後運行它
        字段3 :任務識別器,在日誌文件中標識
        字段4 :要執行的任務
        由/etc/cron.hourly/0anacron 執行
        當執行任務時,更新/var/spool/anacron/cron.daily  文件的時間戳

計劃任務及其相關命令