任务计划通俗来说就是安排系统在未来的某一时间或者是某些时间执行既定的任务。在linux上,实现任务计划的工具一共分为两类:

  1. 实现在未来某一时刻执行某任务的工具:at,batch

    at [-f file] TIME

         TIME的指定方式:绝对时间HH:MM(就是提交任务计划后系统第一次到该时间的时候执行)

                                                   MM/DD/YY     DD.MM.YY

                                      相对时间:now+# time-units(minutes,hours,days,weeks)

    如果不使用-f选项,指定时间后,会打开一个交互式界面,用户在安排任务后,按ctrl+d键提交

    使用at -l可以查看任务列表

           at -c job_num查看某任务内容

           at -d 删除某任务

    -f选项的意义:使用-f指定文件后,at不会再打开交互式界面,也就是要安排的任务直接写在文件中,也可以是一个脚本文件

    batch也是一个实现在未来某一时刻执行一次某任务的命令

        与at使用方式是一样的,不同之处在于batch不用指定时间,而是系统会自动选择在比较空闲的时候执行

  2. 在未来的某些时刻周期性的执行某些任务的工具:cron守护进程,以及anacron

     为了完成周期性的执行某些任务,那就需要一个实时在线的守护进程,在centos6上。由cronie安装生成的cron就是随系统开机启动的守护进程

     首先应该明确:/etc/crontab   /etc/cron.d/* 默认是用于系统cron,在这个文件中的思想是,使用run-parts命令,参数为一个目录文件,例如

    1 3 * * *  root run-parts /etc/cron.weekly/   然后将要执行的命令或者脚本放在该目录下,在指定时间就会安装该文件中文件名的排序一个一个执行(我们也可以在这些文件中添加想要执行的任务)

    /var/spool/cron/目录是用户cron,如果用户在其中创建了任务计划,就会有一个与用户名同名的文件生成,在linux系统上使用crontab命令该文件,因为该命令可以帮助排错

                            crontab 【-u username】options

                                                options:-l:显示当前用户的任务计划

                                                                 -e:编辑当前用户的任务计划

                                                                  -r:删除当前用户的任务计划

                              -u只有root用户可以使用,用于帮助其他用户制定任务计划

                创建任务计划后,如果没有指定相关环境变量。默认系统自动提交的SHELL是/bin/sh,PATH为/bin,/usr/bin

实现机制:crond进程会在/var/spool/cron/目录下查找文件,文件名出现在/etc/passwd的用户名字段的文件符合查找条件,找到后这些文件会被载入内存,然后每一分钟查看,如果符合条件,就会执行相应任务

                同时也会读取/etc/cron.d/目录下的文件,以及/etc/anacrontab文件内容

cron分为系统cron和用户cron在上面提到的文件中,用户cron是放置在/car/spool/cron目录中的,而系统cron则是放在/etc/cron.d/目录下

anacron作为cron的补充机制,用于防止因为系统关机等原因导致的任务未执行



注意点:cron中时间的指定:* * ***:一共为五段,分别表示分时日月周,*表示匹配所有有效取值

                                   ,用于不连续取值

                                   -用于连续取值

                                   /用于在该段每多久

    cron的环境变量:因为在执行系统任务的时候可能用户没有登陆,所以执行的任务就可能出现找不到环境变量的问题。解决办法:在执行的命令之前手动导出环境变量

                                                      命令的路径写全【建议使用此方法】