zoukankan      html  css  js  c++  java
  • Linux计划任务(at,crontab)

    在LINUX中,我们通过crontab和at这两个东西来实现

    at:它是一个可以处理仅执行一次就结束的指令
    crontab:它是会把你指定的工作或任务,比如:脚本等,按照你设定的周期一直循环执行下去


    1.at计划任务的使用
    语法格式: at 时间
    服务:atd
    开启atd服务
    对应的查看atd服务,如果没有启动则启动

    rpm -q at  #查看at包有没有安装
    yum install at -y #安装at包
    #这里可以先查询一下,如果没有at命令的话,则可以直接用yum命令安装

    这里写图片描述
    使用at创建计划任务

    at 20:48     --注意语法,如果是上午的时间,后面要加am如[10:25 am]
    at> mkdir /root/test        ---输入要执行的命令或脚本
    
    at> <EOT>       --按ctrl+d结束
    
    job 1 at Fri Oct 28 20:48:00 2016

    at -l 查看计划任务
    atq 查看计划任务
    at计划任务的特殊写法

    #  at 20:00 2016-10-1   在某天 
    # at now +10min   在 10分钟后执行
    # at 17:00 tomorrow   明天下午5点执行
    # at 6:00 pm +3 days   在3天以后的下午6点执行

    对于系统来说 :计划任务 就是在某个特定的时刻 执行一个脚本文件
    创建成功的at计划任务会在/var/spool/at/目录下成生一个可执行的脚本文件

    每一个脚本都对应一个at计划任务

    删除at计划任务
    atrm 命令
    atrm + 计划任务的编号

    2.crontab定时任务的使用
    crond命令定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作
    cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。
    linux任务调度的工作主要分为以下两类:
    .系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存. 例如/tmp 临时目录
    .个人执行的工作:某个用户定期要做的工作,由每个用户自行设置。

    启动服务

      systemctl status crond    #   (查看crond服务的状态)
      systemctl restart crond   # 重启 
      systemctl enable crond     #   开机自启

    cron命令参数介绍:
    这里写图片描述
    crontab的参数:
    crontab -u #指定某个用户的cron服务
    crontab -l #列出cron服务的详细内容
    crontab -r #删除cron服务
    crontab -e #编辑cron服务
    例如:
    crontab -u root -l # root查看自己的cron计划任务
    crontab -u san -r # root想删除san的cron计划任务

    特殊符号的含义

    符号含义示例
    * 代表取值范围内的数字 (任意)
    / 代表”每” */10
    - 代表从某个数字到某个数字 6-18
    分开几个离散的数字 6,18

    我们可用crontab -e命令来编辑计划任务
    编辑的是/var/spool/cron下对应用户的cron文件
    crontab的计划任务内容保存在目录/var/spool/cron下面

    编辑计划任务

    crontab -u root -e 

    也可以直接在/etc/crontab中添加计划任务
    cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab
    因此我们配置这个文件也能运用cron服务做一些事情。

    用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务
    编辑/etc/crontab 配置文件 (说明)

    vi /etc/crontab

    这里写图片描述
    SHELL=/bin/bash #变量的值指定shell 环境(此处默认为 bash shell);
    PATH=/sbin:/bin:/usr/sbin:/usr/bin # PATH 变量定义用来执行命令的程序路径;
    MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号

    系统级别的计划任务
    对于系统级别的计划任务,需要执行的命令和脚本都放在这里:
    /etc/cron.* 按两次tab

     ls /etc/cron
    cron.d/       cron.deny     cron.monthly/ cron.weekly/  
    cron.daily/   cron.hourly/  crontab       

    目录作用解释:
    cron.d/ #是系统自动定期需要做的任务,但是又不是按小时,按天,按星期,按月来执行的,那么就放在这个目录下面。
    cron.deny #控制用户是否能做计划任务的文件;
    cron.monthly/ #每月执行的脚本;
    cron.weekly/ #每周执行的脚本;
    cron.daily/ #每天执行的脚本;
    cron.hourly/ #每小时执行的脚本;
    crontab #主配置文件 也可添加任务;

    计划任务案例
    1)每天晚上21:30 重启apache
        30 21 * * * /etc/init.d/httpd  restart
    2)每月11022日的4 : 45重启apache。
        45 4 1,10,22 * *  /etc/init.d/httpd  restart
    3)每月110日的4 : 45重启apache。
        45 4 1-10 * *   /etc/init.d/httpd  restart
    4)每隔两天的上午8点到11点的第3和第15分钟执行apach
        3,15 8-11 */2 * * etc/init.d/httpd  restart
    5)晚上11点到早上7点之间,每隔一小时重启apach
        * 23-7/1 * * * /etc/init.d/apach restart
    6)周一到周五每天晚上 21:15 寄一封信给 root@xuegod72:
        15 21 * * 1-5  mail -s "hi" root@xuegod72 < /etc/fstab

    anacron
    cron用控制循环执行例行性工作。如果我要设定机器每早8点进行备份服务。除非我机器保证在8点这个时间点不会关机,如果关机了,cron中的脚本,在下次开机将不会被执行。
    anacron并没有取代cron的意思,anacron用于机器重启后,会侦测停机期间,有没有cron没有执行的计划任务,如果有,会立即执行一下没有执行的任务。

    注意事项
    每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要
    当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
    在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’

    将一个月中10天的日志归档

    #!/usr/bin/env bash
    #[-d $PWD/file] && mkdir -p $PWD/file &&exit 1
    data='/usr/local/src/log'
    cd $data
    date_d=`date +%d`
    result=$[date_d/10]
    result=0
    date_m=`date +%Y%m`
    if [ $result -eq  0 ]
    then
          num=01
          nowdate=`date +%Y-%m-01` #本月第一天
        enddate=`date -d "last day $nowdate" +%Y-%m-%d` #上个月最后一天
        startdate=`date -d "$enddate" +%Y-%m-21`
        end_day=`date -d "$enddate" +%d`
        start_day=`date -d "$startdate" +%d`
        dayDiff=$[end_day-start_day+1]
    fi
    
    if [ $result -eq 1 ]
    then
        num=02
        startdate=`date +%Y-%m-01`
        dayDiff=10
          
    fi
    
    if [ $result -eq 2 ]
    then
         num=03
         dayDiff=10
         startdate=`date +%Y-%m-11`
    fi
    
    targit_dir=${date_m}${num}
    echo $targit_dir
    if [ ! -d $targit_dir ];then
        mkdir $targit_dir
    fi
    for i in `seq $dayDiff`
    do
        find /usr/local/src -name "access.log-$startdate-*" 2> /dev/null -exec mv {} $data/$targit_dir ;
    #    find /usr/local/src -name "access.log-$startdate-*"
        startdate=`date -d "+1 day $startdate" +%Y-%m-%d`
    done
    tar jcf $targit_dir.tar.bz2 $targit_dir
    if [ $? -eq 0 ];then
        rm -fr $targit_dir
    fi
  • 相关阅读:
    [SCOI2015]国旗计划
    [SCOI2015]小凸玩矩阵
    点分治复习笔记
    [HNOI2014]米特运输
    [HNOI2015]接水果
    [HEOI2016/TJOI2016]游戏
    为什么验证集的loss会小于训练集的loss?
    转载GPU并行计算
    深度学习图像标注工具汇总(转载)
    你理解了吗?
  • 原文地址:https://www.cnblogs.com/flyhgx/p/6367978.html
Copyright © 2011-2022 走看看