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/
在这个目录下,每个现在有定时任务的用户都有一个以自己名字命名的文件,我们打开一个文件看看内容。
[[email protected] cron]# pwd /var/spool/cron
[[email protected] cron]# ll 总计 8 -rw------- 1 root root 48 12-14 13:34 oracle -rw------- 1 root root 48 12-14 13:33 root
[[email protected] 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,首先我们来看下它的内容
[[email protected] etc]# pwd /etc
[[email protected] 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/目录下,针对每一行任务建立并维护了一个文件,这个文件存储的就是该计划任务最后被执行的时间戳,内容类如
[[email protected] anacron]# cat cron.daily 20141214
就是一个日期。经过我的测试,这个文件中的时间错由crond和anacrond两个进程共同维护,也可能crond每次执行的时候通知anacrond然后通过anacrond进行维护,总之,如果crond或者anacrond执行了cron.daily目录的内容,这个文件中的时间戳都会更新。
而且,是在执行计划开始前就更新了,所以,如果你中间还没有把所有脚本执行完就执行了关机操作,开机之后这个时间戳还是被更新过了。
所以,整个执行过程大概是这个样子的
开机启动后,anacrond进程查看存在/var/spool/anacron/目录下的事件戳,对比/etc/anacrontab中的配置策略,比如第一条,如果当前时间比文件中记录事件超过了1天。那么anacrond进程将会在65分钟之后,执行后面的定时任务并更新时间戳文件。