码迷,mamicode.com
首页 > 系统相关 > 详细

Linux 任务计划 at,cron

时间:2015-09-08 15:35:03      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:linux   周期性   

linux上的任务计划:

    一种是突发性的,就是未来某个时间点一次性执行某任务

        相关命令:at , batch

    一种是周期性的,就是每个一定的周期执行某任务

        相关命令:crontab


at 命令:处理仅需要执行一次就结束的任务

    at 命令的执行必须要有atd服务的支持,启动atd服务。

  注意:centos7 中对于服务的配置有变化,以下命令仅适用7之前版本,这部分正在查资料,很快补充说明。

#开启atd服务
[root@oc3137372501 ~]# /etc/init.d/atd restart
Stopping atd:                                              [  OK  ]
Starting atd:                                              [  OK  ]

    at的运行方式:

        使用at命令计划将要执行的任务,并将这个任务以文本的方式写入/var/spool/at/目录内,该任务就等待atd服务调用与执行。

        基于安全考虑,并不是所有的人都可以使用at命令进行计划任务。Linux利用/etc/at.allow与/etc/at.deny这两个文件来进行at的使用限制。

        1  先寻找/etc/at.allow文件,在这个文件中存在的用户才可以使用at命令,没在这个文件中的用户则不能使用at命令,(即使没有在at.deny文件中)注:/etc/at.allow比/etc/at.allow要优先

        2  如果/etc/at.allow文件不存在,就寻找/etc/at.deny文件,如果文件中存在用户,则不能使用at命令,而没有存在这个文件中的用户可以使用at命令。

        3  如果这两个文件都不存在,那么只有root可以使用at命令

 at命令的语法: man at

     支持使用作业队列:
         默认为a队列;

at [-V] [-q queue] [-f file] [-mldbv] TIME
at [-V] [-q queue] [-f file] [-mldbv] -t time_arg
at -c job [job...]
atq [-V] [-q queue]
atrm [-V] job [job...]

参数:
 -q 指定队列,默认队列为a队列
 -f /PATH/FROM/SOMEFILE:从指定的文件中读取要运行的作业
 -m 在at工作完成后,即使没有信息输出,也以email方式通知用户
 -l 列出目前系统上面的所有该用户的at任务 相当于atq命令
 -d 取消一个在at计划中的任务 
 -c AT_JOB_NUM:列出后面接的该项任务的实际命令内容
 -d 删除指定作业;相当于atrm命令
       
Time格式:
  1 绝对时间:
    HH:MM  如:13:00
      在今天的HH:MM时刻进行,如果超过该时刻,则明天的该时刻进行此任务
    MMDD[CC]YY, MM/DD/[CC]YY, DD.MM.[CC]YY or [CC]YY-MM-DD
      tomorrow 
        明天执行该任务
  2 相对时间
       now+#UNIT 如 now + 5minutes 5分钟后执行该任务
            minute, hour, day, week
  3 模糊时间
       midnight 午夜
       noon     中午
       teatime  下午

  示例

#建立at 任务
[root@oc3137372501 at]# at now + 2minutes
at> /bin/ls /home/roger/test > /home/roger/test/at_test
at> <EOT>-----------------------------------》命令最后使用ctrl+d 出现<EOT>代表结束
job 3 at 2015-09-07 20:01

#查看at 任务
[root@oc3137372501 at]# at -l
3    2015-09-07 20:01 a root
5    Tue Sep  8 15:00:00 2015 a root
6    Sat Dec  5 19:00:00 2015 a root
7    Wed Sep  9 06:17:00 2015 a root


#验证结果
[roger@oc3137372501 test]$ cat at_test 
at_test
catfile
err_file
file1
file2
out_file
right_file
test_file
test_grep
test_touch
test_tree

      注意:当使用at命令时,将会进入at shell的环境来让用户执行任务命令,所以,注意使用绝对路径执行任务命令。

              如果在at shell内的命令没有任何输出信息是,at默认不会发送email给执行者,如果想让at无论如何都发送一封email,使用at 命令是加上-m选项。


  batch命令:让任务在系统空闲时才执行。

        batch的任务:会在cpu工作负载小于0.8的时候,才进行计划的任务,当系统负载太高时,则暂缓执行。

        batch的用法和at类似,batch没有参数只是任务在系统空闲时执行

#使用batch建立空任务
[root@roger ~]# batch
at> 
at> 
at> 
at> <EOT>
job 1 at 2015-09-07 22:29

 

crontab:周期性任务计划

  crontab命令的执行依赖crond服务

  同样crontab存在限制文件

     -- /etc/cron.allow

        将可以使用crontab的账号写入文件,每个用户占用一行,若不在这个文件中则不可使用crontab

    --/etc/cron.deny

        将不可以使用crontab的账号写入文件,若没有记录到这个文件的用户,就可以使用crontab

    日志文件

       cron执行的每一项任务都会被记录到/var/log/cron日志文件中!

 

  周期性任务分为两类:

  • 系统cron任务;没有默认运行用户身份,所以需要额外指定运行者
      /etc/crontab 编辑该文件设置周期性任务

      vim 命令编辑  /etc/crontab


  • [root@roger ~]# vim /etc/crontab 
    SHELL=/bin/bash    =====================》使用哪种shell接口
    PATH=/sbin:/bin:/usr/sbin:/usr/bin    =========》执行文件查找路径
    MAILTO=root    =================》若有额外standout,以email将数据送给谁
    HOME=/    ==========================》默认此shell的主文件夹所在
    # 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

7个字段:
          前5个字段:时间点
          user-name: 以哪个用户的身份运行任务
          command to be executed: 要运行任务  

  • 用户cron任务:由某个用户所提交,默认就以提交者的身份运行,所以无需额外指定运行者;  /var/spool/cron/USERNAME    用户周期任务记录在该文件中

      vim命令;不建议
      crontab命令:建议 crontab -e    

  • # 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

    6个字段  与系统相比少了执行用户身份

    5个时间点:
            分钟:有效取值范围0-59;
            小时:0-23
            日:1-31
            月:1-12
            周几:0-7   0和7都代表星期天
        注意:几月几号与周几,不建议同时使用;
           例如:
               6 * * * *   表示每天每个时刻的第6分

时间表示法:
       *: 对应时间点有效取值范围内的每个时间点;
       -: 一个特定连续时间范围, 3-7

            10 1-10 * * * command  每天1点到10点之间每小时的10分执行一次任务
       ,:一个离散的时间点, 3,5,7

            0 1,3,5 * * * command  每天的1点
       /#:有效时间范围内的每多少时间;用于指定频率;
             * */4 * * * command   每隔4小时执行一次任务

             0 */4 * * * command   每4小时执行一次任务

        

      5  */3  *  *  *  /bin/echo "hello"  表示每3个小时执行一次输出“hello”
      5  7  *  * 1-5  /bin/echo "hello"  表示在周一到周五每天的7:05 输出“hello”


 crontab命令:
        crontab [-u user] [-l | -r | -e]
              -u user: 不是管理自己的cron任务,而是指定的目标用户的cron任务;仅root拥有管理其它用户的cron任务的权限;默认管理自己的;
              -l: list,列出任务;
              -r: remove, 移除所有任务;如果要移除某项任务使用-e选项编辑
              -e: edit,编辑,打开一当前shell会话的默认编辑器来编辑cron任务表;

     当有执行结果或者执行选项中有输出数据时,将会有email发送给任务执行者,或者MAILTO设置的账号。

     注意

          1  如果不想接收任务执行结果的通知邮件:
                  COMMAND > /dev/null     重定向,将错误信息输出
                  COMMAND &> /dev/null  双重定向,正确和错误的信息都不输出

          2  对于crontab文件来讲,%有特殊功用;如果命令中会出现%, 要记得转义,或者用单引号对   其引用;

          3  crontab的PATH变量与用户的变量不完全相同,所以,建议在cron中的任务要使用绝对路径
               

  示例:

#列出所有任务
[roger@oc3137372501 ~]$ crontab -l
*/2 * * * * /home/roger/sh/meminfo.sh
0 0 * * * /sbin/shutdown -h now
0 12 * * * /bin/mail roger < /home/roger/test/mail_test

    anacron工具:用来处理非24小时一直启动的linux系统的crontab执行ls

    anacron并不能指定某时间执行某任务,而是以天为单位或者是在开机后立刻进行anacron的操作,检测关机期间应该进行但是没有进行的crontab任务,并将该任务执行一遍,然后anacron就会自动停止

    anacron运行时间通常有两个:一个是系统开机期间进行,一个是写入crontab的调度中。

       

练习:
      1、每周一到周六的凌晨3点20分,运行cp命令对/etc/目录进行归档另存,存储位置为/backups/etc-YYYY-MM-DD; 

#创建系统cron任务 /etc/crontab

# 1 创建/backups 目录
[root@oc3137372501 ~]# mkdir /backups
# 2 vim /etc/crontab创建计划任务
20 3 * * 1-6 root /bin/cp -r /etc/ /backups/etc-`date +\%F`


*/2 * * * * root /root/sh_test/fstab_backup.sh

     注:crontab -l 不能查到系统的cron任务,目前我已知方法是cat /etc/crontab


     2、每周日凌晨2点30分,运行cp命令对/etc/fstab文件进行备份,存储位置为/backups/fstab-YYYY-MM-DD-hh-mm-ss

#创建用户cron任务 /var/spool/cron/USERNAME 

#前提 /backups目录已经存在,若不存在需要创建
#创建 /root/sh_test/fstab_backup.sh文件,编辑内容为:
/bin/cp /etc/fstab /backups/fstab-`date +\%F-\%H-%M-%S`
#查看/root/sh_test/fstab_backup.sh权限,确保执行者对该文件有执行权限
[root@oc3137372501 sh_test]# ll
total 4
-rwxr--r--. 1 root root 56 Sep  8 11:11 fstab_backup.sh

#建立用户cron任务
[root@oc3137372501 ~]# crontab -e
#编辑/var/spool/cron/root文件内容为
30 2 * * 0 /root/sh_test/fstab_backup.sh
#查看root用户cron任务列表
[root@oc3137372501 ~]# crontab -l
30 2 * * 0 /root/sh_test/fstab_backup.sh

      3、每天晚上12点,取得/proc/meminfo文件中所有以S或M开头的行,追加至/statistics/meminfo.txt文件中,且每天的消息之前,要加上类似===============分隔线;

#创建用户cron任务  /var/spool/cron/USERNAME 
 
#前提创建/statistics目录
#创建 /root/sh_test/meminfo.sh文件,编辑内容为:
/bin/echo ============================ >> /statistics/meminfo.txt | /bin/egrep ‘^(S|M)‘ /proc/meminfo >> /statistics/meminfo.txt
#查看meminfo.sh权限,确保执行者拥有执行权限
[root@oc3137372501 sh_test]# ll
total 8
-rwxr--r--. 1 root root  56 Sep  8 11:11 fstab_backup.sh
-rwxr--r--. 1 root root 129 Sep  8 13:24 meminfo.sh

#建立用户cron任务
[root@oc3137372501 ~]# crontab -e
#编辑/var/spool/cron/root文件内容为
0 0 * * * /root/sh_test/meminfo.sh
#查看root用户cron任务列表
[root@oc3137372501 ~]# crontab -l
30 2 * * 0 /root/sh_test/fstab_backup.sh
0 0 * * * /root/sh_test/meminfo.sh


如有错误,敬请指正!

谢谢!

Linux 任务计划 at,cron

标签:linux   周期性   

原文地址:http://rogerwang.blog.51cto.com/5326353/1692738

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!