1.Linux任务计划分为两种:

  一是一次性任务执行(at,batch),就是在未来的某个时间段执行一次,比如:定时关机.二是周期性任务(crontab,anacron),在未来指定的时间点循环或每隔多长时间执行一次任务,比如:每天凌晨4点备份数据库或者每隔两天更新一次病毒库等.

首先介绍一次性任务作业:at

at命令是一种交互式命令,它有两种执行模式,一种是交互式,它可以让用户在at>提示符下输入一个或多个命令.一种是批处理式,它将任务的命令写入文件中,由at调用.

我们来看看交互式at,其实很简单,只要键入命令 at TIME,例如:at 20:00,表示在离现在最近的20点执一次行任务,当然,不能是当前以前的时间,只能是当前往后的时间,看示例:

首先是交互式命令

1.命令at TIME

Linux任务作业(单次作业和周期性作业)_第1张图片

2.我们指定了作业,那如何查看作业呢?

使用命令at –l,也可以使用atq,atq命令与at -l是一样的

Linux任务作业(单次作业和周期性作业)_第2张图片

3.咦上面的作业队列是什么啊?作业有队列的概念,默认情况下,所有人的作业都在一队下,这样管理起来就不方便,所以我们就可以给不同的用户或者其他什么的分队列,作业列表是[a-z],请看下图:

使用命令 at –q [a-z]

Linux任务作业(单次作业和周期性作业)_第3张图片

4.如果我们突然又不想执行某个作业了呢?很简单,只要作业的时间没有到,我们都可以使用at –d [作业编号] 都可以删除,我们来看看

使用命令 at –d [作业编号] 也可以使用atrm [作业编号]

Linux任务作业(单次作业和周期性作业)_第4张图片

5.我们再来看看批处理模式,如何实现呢,我们只需事先写好一个脚本,然后使用at –f 去读取脚本既可以

使用命令 at –f [脚本名] [TIME]

先写一个脚本

Linux任务作业(单次作业和周期性作业)_第5张图片

6.然后使用at -f去读取它

Linux任务作业(单次作业和周期性作业)_第6张图片Linux任务作业(单次作业和周期性作业)_第7张图片

忘了说了,任务执行的结果默认会以邮件的方式发送给提交者,只要查收你的邮件就行了.

还有,默认情况下at是谁都可以执行的,但是如果在系统最忙的时候,一个普通用户去执行了at复制大量文件,那就会很占系统资源,所以在/etc/at.deny文件中,可以写入你不想让他执行at的用户的用户名,这样他就不能执行at命令了

Linux任务作业(单次作业和周期性作业)_第8张图片                           r

提示:batch的命令使用与at的区别是,batch不能设定执行的时间,只能由系统自动选择空闲的时间执行

2.周期行任务计划:cron

     crond是守护进程,什么是守护进程呢,就是运行在后台随时监听用户的请求随时响应的进程,在windows上叫做服务进程.那监听是如何实现的呢?它可以使用阻塞和轮循的方式来实现,那我们来说说阻塞和轮循吧.阻塞是什么呢,阻塞就是长期占用一个进程专门负责监听,就好像专门有一个人在门后等人敲门然后开门.那轮循呢,轮循就是有一个进程又负责其他的事情但是过一段时间就会来看看有没有请求需要响应,就想那个人一会去二楼忙事情,一会来看看有没人敲门.

cron又分系统级别和用户级别,那什么是系统级别呢,不知道大家还记得whatis命令吗,在系统运行初期,whatis是查询不到东西的,要通过系统自动创建(当热你也可以手动创建)数据库,然后才会有查询结果,这就是系统cron,也就是由系统自动执行的.但是大家知道,我们的服务器经常是在没有用户登录的情况下也会自动运行他的周期任务,那系统以谁的身份(谁的环境变量)去执行该要运行的进程呢?是否没有一个用户登录他就不能运行到期执行的任务了呢?不是的,系统会以系统的环境变量去运行该些进程,也就是所谓的非登陆时shell,所以大家千万要注意,在编写脚本的时候被调用的命令要写全路径,不然你会出现自己执行命令的时候没问题,但是执行脚本的时候找不到路径的情况,千万要注意!!!那么任务执行的结果我们怎么知道呢?默认会以邮件发方式发送给root用户.

系统cron的文件在,/etc/crontab中,如果想启用系统级别的cron就把命令写进去就行了,要想运行用户级别的cron就直接使用crontab命令就行了,用户crontab在/var/spool/cron/UserName中,来看看下图:

Linux任务作业(单次作业和周期性作业)_第9张图片

我们在来看看它的时间设定,如下图:

Linux任务作业(单次作业和周期性作业)_第10张图片

我们来说说,他有5个"*"号,如果是 8 8 * * *,就表示8点8分,也就是每天的8点8分;8 8 8 * *,表示每个月的8号8点8分;* 8 8 * *表示每个月的8号8点的每一分钟.所以大家要注意了,设定时间的时候,最小的单位都不能为"*",除非你有特殊需求

时间表示法:

1.每个时间都应该使用其可用的有效取值范围内的值;

        7 8 9 * *:表示9号8点7分

2.某时间位上的*表示对应位的多有有效取值

       * 8 9 * *:表示9号8点每一分钟都执行

3.-:连续的时间相邻取值

       10-15 8 9 * *:表示9号8点的10分到15分每分执行一次

4.,:离散的时间取值

        10,15,20 8 9 * *:表示9号8点的10分,15分,20分各执行一次

5./#,表示在指定时间范围内每隔#一次

        */20 8 9 * *:表示9号8点每20分钟执行一次

如果我们不想查看执行的结果呢,可以把输出重定向,如:

0 */2 * * *   /bin/echo “hello” &> /dev/null

或者MAILTO=””,不过不建议这种做法,还是上面一种好点

下面来说说crontab命令:

    -l:查看自己的cron任务列表

    -e:打开自己的crontab列表

    不带参数,就执行类似at的交互式命令

    -r:删除任务

如果是管理员加上-u 可以为普通用户指定任务:如

  crontab –l –u [普通用户]

看实例:

Linux任务作业(单次作业和周期性作业)_第11张图片

Linux任务作业(单次作业和周期性作业)_第12张图片

注意:如果语句里面有"%",需要加上单引号或者转义,如:

5 3 * * * /bin/touch /tmp/test`date+ \%Y-\%m-\%d`.txt

5 3 * * * /bin/touch /tmp/test`date+‘%Y-%m-%d’`.txt