crond是一个系统服务,用于执行定时任务。
它每分钟读取一次三个地方的配置文件,然后执行其标示的命令,这三个地方是:
/etc/crontab,这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab。
/etc/cron.d/,这个目录用来存放任何要执行的crontab文件或脚本。
/var/spool/cron/,这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如tom的crontab任务对应的文件就是/var/spool/cron/tom,一个用户最多只有一个crontab文件。
crontab命令用于管理每个用户的crontab文件。
手动编辑crontab文件时要指定执行用户,crontab -e编辑的则是当前用户的定时任务。
/etc/下还有这几个目录cron.hourly/、cron.daily/、cron.weekly/、cron.monthly/,这几个目录方便管理每小时、每天、每周、每月执行的任务,如要启用它们,需在/etc/crontab或/etc/cron.d/中添加它们,否则它们就是无用的。
/var/spool/cron/归属于root,权限是700,但因为crontab设置了SUID位(参考《Linux下文件和进程的相关用户ID》),普通用户也可以通过crontab命令来管理定时任务。root通过/etc/cron.allow文件来控制谁有权使用crontab命令,如果用户的名字出现在cron.allow文件中,他就有权使用crontab命令。如果cron.allow文件不存在,系统会检查/etc/cron.deny文件来确定是否这个用户被拒绝存取。如果两个文件都存在,cron.allow有优先权。如果两个文件都不存在,只有root可以提交任务。如果cron.deny文件为空文件,所有的用户都可以使用crontab。
crontab文件格式
简单说明
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
例子
# use /bin/bash to run commands, instead of the default /bin/sh
SHELL=/bin/bash
0 22,23 * * 1-5 echo "run at 10 pm and 11 pm on weekdays"
23 0-23/2 * * * echo "run 23 minutes after midnight, 2am, 4am ..., everyday"
# Run on every second Saturday of the month
0 4 8-14 * * test $(date +\%u) -eq 6 && echo "2nd Saturday
0 */4 1 * mon echo "run every 4th hour on the 1st and on every Monday"
0 0 */2 * sun echo "run at midn on every Sunday that's an uneven date"
minute,hour,month of the year三个fields与当前时间匹配,且两个day fileds(day of month,day of week)中至少有一个匹配当前时间时,命令会被执行。
如果两个day fields都是restricted(即不包含*字符),符合二者之一即可。
所以0 */4 1 * mon
中1st和Monday是或的关系,0 0 */2 * sun
中奇数日期和Sunday是且的关系。
更多细节参考man 5 crontab
。
参考
《linux下添加定时任务》
http://blog.csdn.net/hi_kevin/article/details/8983746
《Fine-grainedtask scheduling with cron.d》
http://articles.slicehost.com/2010/8/6/fine-grained-task-scheduling-with-cron-d