任务计划

本文详细介绍Linux系统的任务计划功能,包括一次性任务计划at命令的使用方法、周期性任务计划cron的配置,以及anacron系统如何确保任务在系统重启后仍能执行。同时,文章还介绍了如何管理临时文件和解决计划任务在重启后的无限循环问题。
摘要由CSDN通过智能技术生成

一、任务计划

  Linux任务计划是周期性任务执行,在特定的时间内去安排做一些事情,这样一种事件我们就称之为任务计划,就像人设置的闹钟一样,每天定时定点的会响叫醒人,
  Linux任务计划的分类:
    一次性的任务计划:只执行一次就结束
    at命令就是传梦用来处理一次性的计划任务,
    batch:系统自行选择空闲时间去执行此处指定的任务
   周期性的任务计划:每隔一定的周期去做相同的事情

二、AT命令

  at 命令可用于创建任务计划,或查看任务计划。at是有atd服务提供的,需要启动才能实现at 任务,在centos6上可以使用service atd start 来启动服务,centos7上要使用systemctl start atd.service来启动服务。

 1、at命令的使用方法:

   at [选项] TIME
     选项:
      -V :显示所安装的at包的版本信息
      -v:可以使用较明显的时间格式列出at中的工作列表
      -l: 列出指定队列中等待运行的作业;相当于atq
      -d: 删除指定的作业;相当于atrm
      -c: 查看具体作业任务
      -f /path/from/somefile:从指定的文件中读取任务,一般为已编写好的脚本,在某一刻运行该脚本,把任务机会的内容编写在脚本中
      -m:当任务被完成之后,将给用户发送邮件,即使没有标准输出
     TIME:
      TIME指任务执行的时间,什么时候执行这个任务,TIME有一下几种格式:
        HH:MM 如:20:20 下午8点20分
         在今天的HH:MM时刻进行,若该时刻已超过当时时间,则会在明天的HH:MM进行此工作。(24小时制)
        HH:MM YYYY-MM-DD 如:20:20 2019-01-01 2019年1月1日下午8点20分
         强制规定在某年某月的某一天的特殊时刻进行该工作(24小时制)
        HH:MM[am|pm] [Month] [DATE]\ 如:04pm March 17 3月17日下午4点
         强制某年某月某日的某时刻执行(12小时制)
        HH:MM[am|pm]+number[minutes|hours|days|weeks] 如:now +5minutes或者04pm + 3 days
         指某个时间点再加几个时间后才进行。

     注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户
      例:

      1.创建一个at任务计划

       方法一:
任务计划
       方法二:
任务计划

      2.查看所有的at计划任务

任务计划

      3.删除一个任务计划

任务计划

 2、查看at队列中有哪些at任务计划

   atq :查看当前所有还未执行的任务计划
   at -c # :查看at队列中指定序号#的任务计划的内容,

 3、at的执行方式:

   1)交互式,2)输入重定向,3)at -f 文件
    at队列存放在/var/at.{deny,allow}
     allow 白名单:/etc/at.allow 默认存在,拒绝该文件中用户执行at命令
     deny黑名单:/etc/at.deny默认存在,拒绝该文件用户执行at命令,而没有在at.deny文件中的使用者则可执行
    如果两个文件都不存在,只有root可以执行at命令
    编辑白名单和黑明这两个文件的方法是直接在文件中写入用户名即可

 4、移除at任务

   如果发现一个at任务计划有问题,需要更改,怎么处理呢?可以使用atrm命令删除
    atrm # :删除一个at任务

三、周期性任务计划cron

   相关的程序包:
     cronie: 主程序包,提供crond守护进程及相关辅助工具cronie-anacron:    cronie的补充程序,用于监控cronie任 务执行状况,如cronie中的任务在过去该运行的时间点未能正常 运行,则anacron会随后启动一次此任务
    crontabs:包含CentOS提供系统维护任务

 1、crontab是由crond服务提供的,centos6中可以使用service crond start来启动crond服务,在centos7中要使用systemctl restart crond.crond来启动服务

 2、计划周期性执行的任务提交给crond,到指定的时间会自动运行

 3、cron任务有两类:系统cron和用户cron。系统任务是指系统级别的例行性任务计划,系统级别的cron制定通过编辑其配置文件/etc/crontab来实现

任务计划
  其中:
   五个*表示对应的时间点
   user-name:用户身份;执行任务的用户的用户名
   command to be executd:要运行的任务;可以是命令,可以是脚本文件
  注意:建议在定义cron任务是,所用到的命令使用绝对路径;如果是脚本,脚本中的命令使用绝对路径,或自定义一个拥有完整路径的环境变量,因为如上图所示第二行:PATH=/sbin:/bin:/usr/sbin:/usr/bin 。该脚本中的PATH仅有这几个路径。而在终端上的环境变量PATH确实有更多路径例图:
任务计划
  所以,如果不输入命令的全部绝对路径,那就很可能有些命令会超出本文件中的路径范围,是的命令不能正常执行从而导致出错,脚本中的命令也是要绝对路径

 4、时间表示

   五个*时间点分别是
   分钟 小时 天 月 周几
  相关时间的表示方法,如:
   0 0 1 1 * :每年一月一日0点0分执行一次
   20 20 20 * * :每月20号20点20分执行一次
   20 20 * * *:每天的20点20 分执行一次
   3 * * * *:每小时3分的时候执行一次
   * * * * * :每分钟执行一次
   20 20 * * 3:每周3的20点20分执行一次
  时间表示法:
   1)特定值
    给出时间点有效取值范围内的值(秒不能超过60,小时不能超过24小时)
   2)*
     每...
   3)离散取值(同一个时间点给出多个值,可以是不连续的)
     #,#,#
   4)连续取值(连续的时间值内)
    #-#
   5)在指定时间范围上定义步长(每隔多长时间执行一次)
    */#
      例: */10 * * * * 每隔十分钟执行一次
   6)特殊的时间表示格式
    @reboot Ronce 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、示例

  每分钟以root的身份执行一次/app/sh/qipan.sh这个脚本
任务计划
  每小时的10分20分30分时,以root的身份执行ls /app 这个命令
任务计划
  每天隔10隔小时10分的时候执行wall a
任务计划

 6、对于命令的执行结果

   对于人物运行的后果,默认邮件发送给任务相关的用户,当然也可以丢弃邮件,输出重定向:
    cmd >/dev/null
   cmd \>& /dev/null
   cmd \> /dev/null 2\>&1

 7、用户级的计划任务

    用户级别的计划任务通过crontab命令来实现的,其也有对应的配置文件在/var/spool/cron/目录中,

 8、命令创建用户级别的计划任务命令crontab

   crontab 命令:
    -l:累出已定义好的的所有任务
    -e:打开编辑界面定义任务(会直接进入文件/tmp下以crontab.开头的随机文件中中,一行编辑一个任务计划,然后保存退出,就会自动将计划任务添加至/var/spool/cron/USERNAME中去,每个用户都有专用cron任务文件以自己的用户名为名保存在/var/spool/cron目录中)
    -r:remove,移除所有任务
    -i:同-r 一同使用,以交互式模式移除指定任务
   注意:删除一个任务应该通过-e选项进入编辑界面删除行实现,
   使用crontab命令设置用户级别计划任务的格式跟系统级计划任务的任务格式差不多,格式为: * cmd 。只是少了执行者的用户名
   以上针对的是当前用户的任务计划信息,当然我们还可以针对其他指定用户的任务计划操作,使用-u username ,所支持的选项如上。(仅root可以运行,指定用户管理cron任务)
crontab 也可以不加任何选项,在这种情况下不会进入编辑界面但是会进入一个临时编辑任务的界面,可以输入一行任务计划然后按Ctrl+d保存退出,这个计划任务就会自动写入编辑界面的文件中去,但是有一个缺点,就是会覆盖文件使其之前编辑的任务全部消失,只剩下这一条,而且在这种情况下一次只能编写一条计划任务,如多编辑多条则只有最后一条会生效。但是使用-e选项就不同了,可以一次性编辑多条计划任务,且每一条都会生效。
   例:使用crontab命令在临时界面创建一个任务,然后在使用-l选项查询一下
任务计划
   如果crontab中的命令中需要使用%时,需要对其进行转义,转义符号是“\”,或将%放置于单引号中则可不用转义如上图中所示。
    控制用户执行计划任务的文件
     /etc/cron.{allow|deny}

 9、练习:

  1.没4个小时执行一次对/etc目录的备份,备份至/backkup中,保存的目录名为etc-后面跟当时的时间;如:etc-201804050202

任务计划
   然后保存退出就可以了

  2.编写两个脚本/app/sh/naozhong.sh和/app/sh/xingle.sh,使其每天早上8点自动执行脚本/app/sh/naozhong.sh叫我起床,然后在8点05分时在执行/app/sh/xingle脚本把/app/sh/naozhong 给自动停了。

先变写/app/sh/naozhong.sh脚本
任务计划
再编写/app/sh/xingle.sh脚本
任务计划
最后创建这两个计划任务
任务计划

 10、如何在秒级别运行任务

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

 11、如何实现每隔多长时间运行一次任务

   sleep 命令:
     sleep #[时间单位]
      时间单位:
       s:秒,(默认)
       m:分
       h:小时
       d:天

四、anacron系统

  生产环境中的Linux主机,通常都是全天、全年无休止的工作,同样在其之上制定的任务计划也是需要每天、每周、固定时间去执行,如果没有什么意外情况(譬如:断电),那任务就会按照设定的时间去执行,但是如果在某一周期内系统发生的断电情况,在恢复供电期间正好有一些计划任务去执行,此时任务计划就失效了,当恢复供电之后,系统需要等到下一周期才能继续执行此任务,也就意味着断电期间的任务将失效。但恰恰在这期间要执行的任务也非常重要,该怎么办呢?只能手动去执行了,这...没有自动去执行的方法吗?有!那就是anacron
  anacron并不是用来取代crontab的,anacron存在的目的就在于我们上面提到的,解决一些非24小时在线的Linux系统上的crontab无法正常运行的问题。Anacron并不能指定何时运行某项任务,而是以天为单位或者在启动后立即进行anacron动作,他会去检测停机期间应该进行但是并没有进行的crontab任务,并将该任务运行一遍后,anacron就会自动停止了
  由于anacron会以一天、一周、一个月为周期去检测系统未进行的crontab任务,因此对于某些特殊的使用环境非常有帮助,因此当你的Linux主机断电时,可能存在许多crontab的任务无法进行,anacron刚好可以解决这个问题。如:笔记本电脑、台式机、工作站、偶尔要关机的服务器及其它不一直开机的系统很重要很有用
  那么anacron如何知道Linux系统是何时关机的呢?Anacron会记录上一次anacron执行的时间,anacron会去分析现在的时间与记录上次运行的时间,两者比较后若发现有差异,那就是某些时刻没有进行计划任务了,此时anacron就会开始运行未进行的crontab任务,所以其实anacron也是通过crontab来运行的
  anacron是一个程序,而不是一个服务,anacron也有自己的配置文件,语气相关的配置文件有:
   配置文件:/etc/anacrontab
   负责执行以下几个文件中的系统任务:/etc/cron.daily
                    /etc/cron.weekly
                    /etc/cron.monthly
   由/ec/cron.hourly/Oanncron执行
   当执行任务时,更新/var/spool/anacron/cron.daily文件的时间戳

 1、配置文件

  先来看一下配置文件中的内容
任务计划
  这个文件中设置了要监管哪些文件中的系统任务,使在那些文件中系统任务即使关机没有正常执行的系统任务在开机后也会依旧执行,
  配置文件的编写格式
   Period in days:这是任务的频率,以天来指定,或者是@daily、@weekly、@monthly代表每天、每周、每月一次,你也可以使用数字:1代表每天;7代表每周;30代表每月
   Delay in mminutes:这是在执行一个任务前等待的时间,单位是分钟。
   Job-identifier:这是卸载日志文件中任务的独特名字
   Command:这是执行任务的命令或shell脚本,或者是文件,文件里面包含一些系统任务

 2、anacron的执行流程

  Anacron会检查任务是否已经在period字段指定的时间被执行了。如果没有,则在等待delay字段中指定的分钟数后,执行cmmand字段中指定的命令,一旦任务呗执行了,它会使用job-identifier(时间戳文件名)字段中指定的名称将日期记录在/var/spool/anacron目录中的时间戳文件中。

 3、管理临时文件

  1.Centos6使用/etc/cron.daily/tmpwatch定时清除临时文件

   tmpwatch工具从指定的目录中递归地搜索,并删除在指定时间段内没有被访问的文件。tmpwatch一般被用来清扫那些用来临时驻留文件的目录,(譬如:/tmp)tmpwatch忽略符号链接,它不会切换文件系统,而且只删除空目录和常规文件

   1)语法:

     tmpwatch [短选项] [长选项] [超期时间] [目录...]
      选项:
       -a或- -all :删除任何类型的文件
       -f或- -force :强制删除文件或目录,其效果类似rm指令的“-f”参数
       -q或- -quite :不显示执行执行过程
       -v或- -verbose :详细的显示指令执行过程
       -test :仅测试,并不是真的删除文件或目录

  2.Centos7使用systemd-tmpfiles-setup服务实现

   配置文件: /etc/tmpfiles.d/*.conf
         /run/tmpfiles.d/*.conf
         /usr/lib/tmpfiles/*.conf
   查看一下系统临时文件的配置文件/usr/lib/tmpfiles.d/tmp.conf
任务计划

   1)临时文件的配置文件格式

     文件类型   文件名  权限   所属人  所属组   文件的存在时间
      v      /tmp   1777   root     root     10d
    文件名就是保存临时文件的目录
     关于文件存在时间的设定就是在该时间内文件不能被删除,超过那个时间才可以被删除,单位s/秒;h/小时;d/天

   2)命令systemd-tmpfiles

    systemd-tmpfiles --create /usr/lib/tmpfiles.d/*.conf :执行临时文件的配置
    systemd-tmpfiles --clean /usr/lib/tmpfiles.d/*conf :清理该配置文件中超过文&件存在时间的临时文件
    systemd-tmpfiles --remove /usr/lib/tmpfiles.d/*conf:删除配置文件中所有的临时文件

五、计划任务Reboot的解决方法

  还有一种情况就是在编辑计划任务的时候,设置了一条在重启之后重启的计划任务怎么办解决,因为如果这样,重启之后就会执行计划任务重新启动,启动成功后又执行计划任务重新启动,将会进入无穷无尽的重启使其开不开机,在这种情况下,我们将怎么办呢?
   如:@reboot root /bin/reboot
   别急还有有办法的,如下:
  Centos 7:

  1.重启之后,进入grub,在Linux16这一行的行未加上空格rd.break;按Ctrl+x
  2.mount -o remount,rw/sysroot
  3.vi /sysroot/etc/crontab删除文件中那一行计划任务重启即可

  Centos 6:

  1.进入grub:在kernel这一行最后加空格1;先esc回到主界面,再按b启动
  2.vim /etc/crontab

转载于:https://blog.51cto.com/13570214/2090672

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值