首页 > 代码库 > rhel中定时任务cron解析

rhel中定时任务cron解析

cron

cron是一个工具名字,它的作用就是根据一定的时间策略,执行你指定的脚本,跟windows下的定时任务是一样的。

它对应的守护进程为crond,是被当做服务在开机的时候启动。

所以,cron可以使用服务管理命令,比如service,chkconfig来进行管理。

具体使用可参考:

http://blog.csdn.net/jx_jy/article/details/13289217

配置文件

crond进程每一分钟被唤醒一次,读入自己的配置文件,根据配置文件中设定的策略执行脚本任务,cron的配置文件有两个位置

/etc/crontab

/var/spool/cron

首先看下/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
前四行的变量定义部分就不说了,指定PATH,SHELL等。

最后四行就是要执行的任务和执行该任务的策略。

具体格式为

1、分(1-60)  * 表示所有,例如2-10指只有每小时的第2分到第10分才执行该任务,还可以使用分号2-10/2,后面的2表示间隔两分钟执行一次,若想间隔3分钟,把2改成3就行了,后面列的时、天,月,星期的设定格式都符合此语法。

2、时(1-24)

3、天(1-30)  这里每个月的天并非自然月一样,存在31天28天什么的,它的范围就是1-30。

4、月(1-12)

5、星期(0-6) 0表示周日

6、执行该脚本的用户     

7、执行选项            如果需要执行某个文件夹下面所有的脚本,需要使用run-parts参数,如果后面是指定一个具体脚本,这个地方可为空。

8、要执行的脚本,或脚本所在目录

从上面你也可以看出,系统预定义了一些路径在指定的路径下,比如/etc/cron.hourly下面的脚本会在每小时的第一分钟执行一次。/etc/daily下的脚本会在每天的4时02分执行。

所以,若果你想增加自己的定时任务,也可以直接在这个crontab文件中增加一行,也可以按照系统预定策略,把你的脚本放在合适的文件夹下面。

再看下另外的一个配置文件

/etc/spool/cron/

在这个目录下,每个现在有定时任务的用户都有一个以自己名字命名的文件,我们打开一个文件看看内容。

[root@server1 cron]# pwd
/var/spool/cron
[root@server1 cron]# ll总计 8-rw------- 1 root root 48 12-14 13:34 oracle-rw------- 1 root root 48 12-14 13:33 root
[root@server1 cron]# cat root
18-23/2 * * * * /home/oracle/shell/test_cron.sh

我们可以看最后一个root用户下的文件内容。

对比上面crontab文件的内容,我们发现,它只是少了指定用户的部分,解析下上面定时任务为

每小时的18分到23分钟之间,每2分钟执行一次/home/oracle/shell/test_cron.sh脚本。

这里我做了一个小小的没有太大意义的实验,就是在同一个文件夹下面的脚本的执行顺序改如何制定,实验结果证明是执行结果是跟ls查看的顺序一致的,可能这也是rc0n.d目录下的脚本都作了以数字开头决定顺序的原理。如果你多个脚本有依赖关系,最好使用脚本调用解决。

cron的配置命令crontab

crontab命令是你配置定时任务的专用命令,除了root用户,比如oracle这些用户对/etc/crontab这些配置文件是没有更改权限的,甚至连/var/spool/cron目录都进不去。

所以就需要借助crontab命令,这个命令很简单

-u   oracle  后面加用户名,表示对特定用户进行配置查询,如果没有这个参数,则对当前用户进行配置查询

-l    显示用户下的定时任务

-e   编辑用户的定时任务,其实就是打开vi编辑器,增删改相应条目

-r   删除用户的所有定时任务

举个例子:查看oracle下的定时任务  crontab -u oracle -l

    编辑oracle下的定时任务  crontab -u oracle -e

    删除oracle的所有定时任务    crontab -r

此外,这个crontab命令只查询/var/spool/cron目录下该用户文件的内容,而不会查询/etc/crontab的内容。所以,检查用户定时任务的时候需要细致些。

cron的辅助工具anacrond

从cron的时间策略可以看出来,它执行定时任务是在特定时间点执行的,比如凌晨4点02分,如果你的机器不是24小时开机,或者正好4点到5点故障关机。那么这一天的定时任务就没法执行了,所以,anacron就是为了弥补cron的这个弱点的。

实际上,anacron只有一个配置文件/etc/anacrontab,首先我们来看下它的内容

[root@server1 etc]# pwd
/etc
[root@server1 etc]# cat anacrontab 
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

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
前几行就不说了,我们看看最后3行。还是按列说明

1、间隔,单位是天

2、延迟执行时间,单位是分钟

3、执行任务标示 ,就是起个名字,自定义的

4、执行的脚本,这个地方还是使用了run-parts,很明显这是执行这个文件夹下的所有内容,跟cron一样

那么它是如何工作的呢。

首先,它在/var/spool/anacron/目录下,针对每一行任务建立并维护了一个文件,这个文件存储的就是该计划任务最后被执行的时间戳,内容类如

[root@server1 anacron]# cat cron.daily 
20141214
就是一个日期。经过我的测试,这个文件中的时间错由crond和anacrond两个进程共同维护,也可能crond每次执行的时候通知anacrond然后通过anacrond进行维护,总之,如果crond或者anacrond执行了cron.daily目录的内容,这个文件中的时间戳都会更新。

而且,是在执行计划开始前就更新了,所以,如果你中间还没有把所有脚本执行完就执行了关机操作,开机之后这个时间戳还是被更新过了。

所以,整个执行过程大概是这个样子的

开机启动后,anacrond进程查看存在/var/spool/anacron/目录下的事件戳,对比/etc/anacrontab中的配置策略,比如第一条,如果当前时间比文件中记录事件超过了1天。那么anacrond进程将会在65分钟之后,执行后面的定时任务并更新时间戳文件。



rhel中定时任务cron解析