Linux 任務計劃、周期性任務執行

Linux 任務計劃、周期性任務執行



概述:

     什么是任務計劃呢?就像我們每個人日常生活中都會使用到的鬧鐘一樣,按時的去提醒該去做什么事情,以免忘記。同樣,我們在工作當中也要在每天在特定的時間內安排做一些事情,這就是任務計劃,本章將學習如何制定Linux系統的任務計劃,這里主要包括兩種工具:at和crontab。


一、定義

1.任務計劃的分類:
     一次性的任務計劃:只執行一次就結束;
     周期性的任務計劃:每隔一定的時期去做相同的事情;
2.使用的命令
     未來時間點執行一次某任務:at, batch;
     周期性運行某任務: crontab

3.執行結果會通過郵件發送給用戶
確定郵件服務是否開啟執行如下命令,能看到25號端口即開啟

        ~]# netstat -tnlp   ~]# ss -tnl

[root@CentOS6 ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:53634               0.0.0.0:*                   LISTEN      1690/rpc.statd      
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1648/rpcbind        
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1904/sshd           
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1725/cupsd          
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1983/master         
tcp        0      0 127.0.0.1:6010              0.0.0.0:*                   LISTEN      2167/sshd           
tcp        0      0 :::111                      :::*                        LISTEN      1648/rpcbind        
tcp        0      0 :::57264                    :::*                        LISTEN      1690/rpc.statd      
tcp        0      0 :::22                       :::*                        LISTEN      1904/sshd           
tcp        0      0 ::1:631                     :::*                        LISTEN      1725/cupsd          
tcp        0      0 ::1:25                      :::*                        LISTEN      1983/master         
tcp        0      0 ::1:6010                    :::*                        LISTEN      2167/sshd

4.本地電子郵件服務:

     smtp協議:simple mail transmission protocol 簡單郵件傳輸協議;

     pop3:Post Office Procotol 郵局協議

     imap4:Internet Mail Access Procotol 互聯網郵件訪問協議;

5.本地主機收發郵件

   MUA:Mail User Agent,用戶收發郵件的工具程序;

   mail 命令

   語法:mailx [-s 'SUBJECT'] username[@hostname]

   郵件正文的生成:  

       1)交互式輸入:. 號單獨成行可以表示正文結束;Ctrl+d提交亦可;
                mail -s 'Hello root' root
        2)通過輸入重定向;
                mail -s 'fstab file' root < /etc/fstab
        3)通過管道;  
               cat /etc/issue |mail -s 'issue file' root



at命令

 1.at是由atd提供服務的,在使用之前要確認是否開啟;

       CentOS 6:service atd {status|start}

       CentOS 7: systemctl {status|start} atd


 2.語法:at [option] TIME

 TIME:定義出什么時候執行這項任務

  • HH:MM [YYYY-mm-dd];

  • HH:MM[am|pm] [Month] [Date];

  • noon, midnight, teatime(下午4點),tomorrow

  • now+#{minutes,hours,days, OR weeks}

 示例:      

     1)HH:MM 如:02:00

           在今日的HH:MM 進行,若該時刻已過,則明天此時執行任務

     2)HH:MM YYYY-MM-DD 如:04:00 2016-09-20

           規定在某年某月的某一天的特殊時刻進行該項任務

     3)HH:MM[am|pm] [Month] [Date]

             04pm March 17

            17:20 tomorrow

     4)HH:MM[am|pm] + number [minutes|hours|days|weeks]

           在某個時間點再加幾個時間后才進行該項任務

             如:now + 5 minutes

                  04pm + 3 days

     示例:

[root@CentOS6 ~]# at now+1min
at> ls
at> echo "hello taotao"<EOT>
job 11 at 2016-09-11 05:02
[root@CentOS6 ~]# at -l
13	2016-09-11 05:12 a root
[root@CentOS6 ~]# at 20:00
at> echo "hello tao" |mail -s 'TAO test' tao
at> <EOT>
job 14 at 2016-09-11 20:00

3.at 的作業有隊列,存放在/var/spool/at 中,用單個字母來表示,默認搜使用a隊列;

wKiom1fVJIbxVjKtAAAV7u9Ap4c506.png

4.常用選項:

        -q QUEUE:指明隊列;

        -l: 列出指定隊列中等待運行的作業;相當于atq

        -d #: 刪除指定作業號的作業;相當于atrm

        -c: 查看具體作業任務

        -v:可以使用較明顯的時間格式列出at中的工作列表;

        -f /path/from/somefile:從指定的文件中讀取任務,不再交互式輸入

                # at -f /testdir/at.txt

        -m:強制at發送郵件,表示執行完畢

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

5./etc/at.{allow,deny}控制用戶是否能執行at任務

   白名單

       /etc/at.allow 默認不存在,只有該文件中的用戶才能執行at命令

   黑名單

      /etc/at.deny 拒絕該文件中用戶執行at命令,而沒有在at.deny 文件中的使用者則可執行。

 注意:

     1)白名單的優先級是大于黑名單的,如果一旦創建,則只有白名單中的用戶,才可以執行at命令,其他用戶即使不白名單中的用戶統統沒有權限執行at命令;如果沒有白名單,則只有黑名單起作用,此時,在黑名單中的用戶是不能執行at命令的,不在黑名單中的用戶統統默認是允許執行at命令的;

     2)如果兩個文件都不存在,只有root 可以執行at 命令

2.batch命令

讓系統自行選擇空閑時間去執行此處指定的任務;



周期性任務計劃:cron;

1.服務程序相關的程序包     

  • cronie: 主程序包,提供crond守護進程及相關輔助工具

  • cronie-anacron:cronie的補充程序;用于監控cronie任務執行狀況;如cronie中的任務在過去該運行的時間點未能正常運行,則anacron會隨后啟動一次此任務

  • crontabs:包含CentOS提供系統維護任務


2.確保crond守護進程(daemon)處于運行狀態

  • CentOS 7: systemctl status crond

[root@centos7 ~]# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2016-09-11 10:33:25 CST; 2h 26min ago
  • CentOS 6 :service crond status

[root@CentOS6 ~]# service crond status
crond (pid  2024) is running...


3.向crond提交作業的方式不同于at,他需要使用專用的配置文件,此文件有固定格式,不建議使用文本編輯器直接編輯此文件,要使用crontab命令,可以檢查語法是否有錯誤


4.cron任務分為兩類:

  • 系統cron任務:主要用于實現系統自身的維護;

           手動編輯:/etc/crontab文件

  • 用戶cron任務:命令 crontab


5.用cron執行的計劃任務默認存放在:

    日志:/var/log/cron


cron 配置格式

1.系統cron的配置格式/etc/crontab

    如下:

[root@CentOS6 ~]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# 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


2.注意:  

  • 每一行定義一個周期性任務;共7個字段
          * * * * *:定義周期性時間;
          user-name:運行任務的用戶身份;
          command to be executed:要執性的任務     

  • 此處的環境變量不同股用戶登錄后獲得的環境變量,因此,建議命令使用絕對路徑,或者自定義的PATH環境變量

  • 執性結果郵件發送給MAILTO指定的用戶


3.系統的計劃任務:

  • /etc/crontab

  • /etc/cron.d/ 配置文件  

[root@CentOS6 ~]# cd /etc/cron.d
[root@CentOS6 cron.d]# cat 0hourly 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin  
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly   
     # run-parts 為一個程序,可以把腳本放在一個文件中一起執行,不用單個執行
  • /etc/cron.hourly/ 腳本

  • /etc/cron.daily/腳本

  • /etc/cron.weekly/腳本

  • /etc/cron.monthly/腳本


2.用戶cron配置格式:/var/spool/cron/USERNAME

   使用命令:crontab -e

如下:

[root@CentOS6 ~]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# 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
# |  |  |  |  |
# *  *  *  *  *  command to be executed

注意:

  • 每行定義一個cron任務,共6個字段

  • 此處的環境變量不同股用戶登錄后獲得的環境變量,因此,建議命令使用絕對路徑,或者自定義的PATH環境變量

  • 郵件發送給當前用戶


時間表示法:

五個時間點分別是:分鐘 小時 天 月 周幾

 1.特定值:

      給定時間點有效取值范圍內的值;    

    注意:day of week和day of month一般不同時使用;

 2.*:

      給定時間點上有效取值范圍內的所有值;表示“每..”

示例:

   (1)3 * * * *:每小時執行一次,每小時第三分鐘;

   (2)3 4 * * 5:每周執行一次,每周五的4點3分;

   (3)5 6 7 * *:每月執性一次,每月的7號6點5分;

   (4)7 8 9 10 *:每年執行一次,每年的10月9號8點7分;

 3.離散取值:,

       在時間點上使用逗號分割的多個值:#,#,#

示例:

   (1)9 8 * * 3,7:每周三和周日的8點9分;

   (2)0 8,20 * * 3,7:每周三和周日的8點和20點

 4.連續取值:-

         在時間點導航使用-連接開頭和結束:#-#

示例:

   (1)0 9-18 * * 1-5:周一到周五(工作時間)內的每小時執行;

 5.在指定時間點上,定義步長

         */#:#即步長

    注意:

         1)指定的時間點不能被步長整除時,其意義將不復存在;

         2)最小時間單位為“分鐘”,想完成“秒”級任務,的需要額外借助其它機制;

             即:定義成每分鐘任務,而再利用腳本實現每分鐘之內,循環執行多次;     

示例:

   (1)*/5 * * * *:每5分鐘執行一次任務;

   (2)*/7:不能被整除,沒有意義

6.預定義的時間格式:  

   @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 * * * *  每小時


crontab命令

1.語法:crontab [-u user] [-l | -r | -e] [-i] 

     -e:打開編輯界面定義任務;

     -l:列出所有任務

     -r:移除所有任務,即刪除/var/spool/cron/USERNAME文件

          (刪除一個任務應該通過編輯界面刪除行實現)

     -i:在使用-r選項移除所有任務時提示用戶確認;

     -u user:root用戶可為指定用戶管理cron任務;

[root@CentOS6 ~]# crontab -u tao -e
  */2 * * * * /bin/echo "加油!??!"
[root@CentOS6 ~]# crontab -u tao -l
*/2 * * * * /bin/echo "加油?。?!"
You have new mail in /var/spool/mail/root

2.注意:

  • 運行結果以郵件通知給當前用戶;如果拒接接收郵件

        (1)COMMAND > /dev/null

        (2)COMMAND &> /dev/null

  • 定義COMMAND時,如果命令需要用到%,需要對其轉義,但放置于單引號中的%不用轉義亦可;

      如:touch $(date +%Y-%m-%d-%H-%M-%S)

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

     不會執行!

     如果期望某時間因故未能按時執行,下次開機后無論是否到了相應時間點都要執行一次,可使用ancorn命令;

4.思考:

 (1) 如何在秒級別運行任務?

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

(2)sleep命令:

   sleep NUMBER[SUFFIX]…

   SUFFIX:

      s: 秒, 默認

      m: 分

      h: 小時

      d: 天


ancorn 命令:

運行計算機關機時cron不運行的任務,CentOS6以后版本取消anacron服務,由crond服務管理。

假設計算機沒有一直開機

對筆記本電腦、臺式機、工作站及其它不一直開機的系統很重要

對偶爾要關機的服務器很有用

配置文件:/etc/anacrontab,負責執行/etc/cron.daily ,/etc/cron.weekly /etc/cron.monthly中系統任務。/etc/cron.hourly/由/cron.d/0hourly執行

    字段1:如果在這些日子里沒有運行這些任務……

    字段2:在重新引導后等待這么多分鐘后運行它

    字段3:任務識別器,在日志文件中標識

    字段4:要執行的任務

    當執行任務時,更新/var/spool/anacron/中文件的時間戳


管理臨時文件:系統自定義的文件

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

  CentOS7使用systemd-tmpfiles-setup服務實現

 配置文件:

    /etc/tmpfiles.d/*.conf

    /run/tmpfiles.d/*.conf

    /usr/lib/tmpfiles/*.conf

    /usr/lib/tmpfiles.d/tmp.conf

    d /tmp 1777 root root 10d

    d /var/tmp 1777 root root 30d

命令:

    systemd-tmpfiles –clean|remove|create configfile


案例:

1、每4小時備份一次/etc目錄至/backup目錄中,保存的文件名稱格式為“etc-yyyy-mm-dd-HH”

# mkdir /backup
# crontab -e
 0 */4 * * * /bin/cp -a /etc /backup/etc-`date + '%F-%H'` > /dev/null

2、每周2, 4, 7備份/var/log/messages文件至/logs目錄中,文件名形如“messages-yyyymmdd”

# mkdir /logs
# crontab -e
# 20 1 * * 2,4,0 /bin/cp -a /var/log/messages /logs/messages-`date +'%Y%m%d'` > /dev/null

3、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中

# crontab -e
# 20 */2 * * * /bin/grep -e '^S' -e '^M' /proc/meminfo >> /tmp/meminfo.txt

4、工作日時間內,每兩小時執行一次“ip addr show”命令

# crontab -e
# 0 9-17/2 * * 1-5 /bin/`ip addr show`

     

原創文章,作者:zhumengxiaotao,如若轉載,請注明出處:http://www.www58058.com/45443

(1)
zhumengxiaotaozhumengxiaotao
上一篇 2016-09-11
下一篇 2016-09-11

相關推薦

  • Bonding多塊網卡綁定同一IP地址

    Bonding多塊網卡綁定同一IP地址 就是將多塊網卡綁定同一IP地址對外提供服務,可以實現高可用或者負載均衡。當然,直接給兩塊網卡設置同一IP地址是不可能的。通過bonding,虛擬一塊網卡對外提供連接,物理網卡的被修改為相同的MAC地址。 一共有七種模式這里提供三種常用的:   一、Mode 0 (balance-rr)  輪轉( Round-robin…

    Linux干貨 2016-09-07
  • bash特性

    bash特性之一:命令別名      獲取當前用戶可用的別名的定義:  bash的特性之二:命令歷史      命令語法格式:      history [-c] [-d OFFSET] [n]&nb…

    Linux干貨 2016-11-06
  • python使用paramiko 模塊建立ssh通訊

    一 paramiko簡介 下文是我從別人博客那里copy下來的: paramiko是用python語言寫的一個模塊,遵循SSH2協議,支持以加密和認證的方式,進行遠程服務器的連接。 由于使用的是python這樣的能夠跨平臺運行的語言,所以所有python支持的平臺,如Linux, Solaris, BSD, MacOSX, Windows…

    Linux干貨 2017-03-07
  • 磁盤管理

    磁盤管理

    Linux干貨 2017-10-27
  • 磁盤冗余陣列 RAID

    一、磁盤冗余陣列 RAID(Redundant Array of Independent Disk)     RAID是一種把多塊獨立的硬盤(物理硬盤)按不同的方式組合起來形成一個硬盤組(邏輯硬盤),從而提供比單個硬盤更高的存儲性能和提供數據備份技術。根據磁盤陳列的不同組合方式,可以將RAID分為不同的級別。 其中提高傳輸速率和…

    Linux干貨 2016-09-07
  • PHP中引用的詳解(引用計數、寫時拷貝)

    《PHP5中文手冊》內容中"引用的解釋"一文的摘要: 1. PHP中引用的特性 PHP中引用意味著用不同的名字訪問同一個變量內容,引用不是C的指針(C語言中的指針里面存儲的是變量的內容,在內存中存放的地址),是變量的另外一個別名或者映射。注意在 PHP 中,變量名和變量內容是不一樣的,因此同樣的內容可以有不同的名字。最接近的比喻是 Uni…

    Linux干貨 2015-04-10
欧美性久久久久