计划任务,即是在约定好的时间执行计划好的任务,在Linux我们惊颤更使用crond服务来完成次工作,cron服务器可以根据配置文件约定好的时间执行特定的任务。比如说,我们在每天凌晨4点更新一次数据库,这既是计划任务。

    Linux,实现计划任务有三种方式:

1 at 指定一个时间执行一次或多次任务,一次性使用

2 cron 根据配置文件的时间表自动执行任务,周期性执行

3 系统级别的任务计划及其扩展anacron:错过计划任务执行时间后尽快按照定义频率执行一次

下面我们来一个一个讲解:

一:at:

#at 08:08

>echo "Hello"

>Ctrl+d(结束)

上面几行表示在08:08分输出Hello,但是不会显示处理出来,因为执行结果会以邮件方式发送给执行用户。

at -l 或者是 atq 查询当前正在等待的计划任务,显示如下

 

2 2011-05-21 01:01 a root

1 2011-05-21 08:08 a root

 

前面的数字表示计划任务号

at -d 或者是 atrm 删除计划任务

atrm 1 

atrm 2

也可以进入/var/spoll/at目录把计划任务删除,at的计划任务都保存在该目录中。

管理员用户有使用at的权限,普通用户是否可以使用at取决于/etc/at.allow和/etc/at.deny文件,两者都有责取allow。一般默认所有用户允许。

 

二:cron服务,周期性的执行某个计划任务

cron服务由vixie-cron-4.1-76.e15软件包提供,我们可以使用  rpm -qa(查询所有安装的软件包)| grep cron 查询该软件包是否安装,安装完启动cron服务。

 

cron依靠crontab文件保存用户定义的任务计划

crontab文件分为两类:分别是系统crontab和用户crontab

系统crontab: 定义在/etc/crontab

用户crontab:定义在/var/spool/cron/USERNAME

我们定义cron任务都是编写crontab文件完成,下面看一下crontab文件内的格式:

每一行的前五段是时间,第六段是命令

MIN HOUR DAY MONTH WEEK COMMAND

时间的取值范围:

MIN:0-59 HOUR:0-23 DAY:1-31 MONTH:1-12 WEEK:0-7(0和7都表示周日)

介绍下文件内符号的用法:

*:对应时间域上的所有有效取值

- : 对应时间域上的连续时间取值  8-18 表示第8到18

, : 对应时间域上的离散时间取值  8,18 表示第8 和第18

*/: 对应时间域上的没多久一次进行取值 例如:*/8    每8min/hour/...一次

通过例子了解一下:

30 17 * * * /sbin/shutdown -h now   每天的5点30分关机  

03 02 * * 3,6 /usr/bin/yum clean all  每周3周6的凌晨2点3分清空yum缓存

00 */6 * * * /usr/bin/updatedb 每六小时更新一次数据库

* */6 * * * /usr/bin/updatedb 则表示每第6个小时的每分钟都更新一次

 

 

定义自己的crontab:

# crontab -e 编辑当前用户的cron表 

# crontab -l 列出当前用户的cron表

# crontab -r 删除当前用户的cron进程

# cron -u USERNAME 管理员权限帮别人定义  crontab -u USERNAME [-l | -r | -e]

当然,我们也可以不打开文件添加内容到crontab中:

echo '10 1 * * 7 tar -jcf /backup/data-`date '+%F'`.tar.bz2 /data' >> /var/spool/cron/USERNAME

echo '10 1 * * 7 tar -jcf /backup/data-`date '+%F'`.tar.bz2 /data' | crontab

系统crom:

/etc/crontab里面的格式:

 

SHELL=/bin/bash                      定义运行计划任务的解释器

PATH=/sbin:/bin:/usr/sbin:/usr/bin   执行命令的环境变量

MAILTO=root                          计划任务的发出者

HOME=/                               家目录

 

# run-parts

 

01 * * * * root run-parts /etc/cron.hourly

02 4 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

run-parts 表示将指定目录中的脚本顺序执行一次

 

anacron:

anacrontab文件是系统计划任务的扩展文件:在一个指定时间间隔错过后自动执行任务。也就是说如果定义事件计算机关闭了,开机会它会尽快按定义频率执行一次。

定义文件 /etc/anacrontab

每一段的含义:

过去多长时间未执行(天) 启动延迟(开机后多久执行)  说明信息  把文件中的脚本执行一遍  

 

1 65 cron.daily        run-parts /etc/cron.daily

7 70 cron.weekly   run-parts /etc/cron.weekly

30 75 cron.monthly   run-parts /etc/cron.monthly

第一行的意思是:每天开机65分钟后检查/etc/cron.daily中的脚本是否被执行了,如果今天没有被执行就执行它

第二行的意思是:每隔7天开机后17分后检查/etc/cron.weekly中的脚本是否被执行,如果一周内都没有执行,便执行它

第三行也是一样~

 

需要知道,在/etc/crontab与/etc/anacrontab文件中定义的目录内,脚本前的数字越小,越先执行。

 

用户使用cron的权限在下面两个文件中定义:

/etc/cron.allow

/etc/cron.deny

如果两文件都不存在 只有管理员能够使用cron

一般我们系统只有deny文件 只定义拒绝使用cron的用户

如果两个文件中存在同一用户,则allow优先,用户可以使用cron

(被拒绝用户不可以使用crontab,但还可以使用at定义计划任务)