简单定义
cron(crond):一可根据时间、日期、月份、星期的组合来调度重复任务执行的守护进程
crontab(cron table):用于设定cron服务任务列表的工具
语法
* * * * * command
分 时 日 月 周 命令
.macros.h
分:0-59
时:0-23
日:1-31
月:1-12 或 Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
周:0-7 0和7表示周日(7为兼容)或 Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun
预定义:.entry.c
@reboot 重启系统时执行
@yearly或@annually 每年1月1日0点整执行一次,相当于0 0 1 1 *
@monthly 每月1日0点整执行一次,相当 于0 0 1 * *
@weekly 每星期天0点整执行一次,相当于0 0 * * 0
@daily 每天0点整执行一次,相当于0 0 * * *
@hourly 每小时整执行一次,相当 于0 * * * *
特殊符号:
* 任何
/ 每遇
% 换行
, 列表
– 范围
使用
crontab -e 编辑当前用户的定时列表,默认使用vi编辑,可设置环境变量VISUAL或EDITOR指定喜欢的编辑器
crontab -l 查看当前用户已设定的定时列表
crontab -r 清空当前用户已设定的定时列表
crontab filename 用filename文件的内容来替换当前用户定时列表
crontab -u xxx [–e/l/r/…, filename] root用户专用选项,用于设定某用户的定时
……
man crontab
每个用户设定的定时列表存放于/var/spool/cron目录下,该目录只允许root用户访问到
一些例子:
43 21 * * * 21:43 执行
15 05 * * * 05:15 执行
0 17 * * * 17:00 执行
0 17 * * 1 每周一的 17:00 执行
0,10 17 * * 0,2,3 每周日,周二,周三的 17:00和 17:10 执行
0-10 17 1 * * 毎月1日从 17:00到7:10 毎隔1分钟 执行
0 0 1,15 * 1 毎月1日和 15日和 一日的 0:00 执行
42 4 1 * * 毎月1日的 4:42分 执行
0 21 * * 1-6 周一到周六 21:00 执行
0,10,20,30,40,50 * * * * 每隔10分 执行
*/10 * * * * 每隔10分 执行
* 1 * * * 从1:0到1:59 每隔1分钟 执行
0 1 * * * 1:00 执行
0 */1 * * * 毎时0分 每隔1小时 执行
0 * * * * 毎时0分 每隔1小时 执行
2 8-20/3 * * * 8:02,11:02,14:02,17:02,20:02 执行
30 5 1,15 * * 1日 和 15日的 5:30 执行
30 12 11 9 5 每周五或每年的9月11号 12点30
只是玩玩:
* * * * * /bin/date
* * * * * sleep 20; /bin/date
* * * * * sleep 40; /bin/date
杂项:
/var/log/cron文件里记录了已执行过的定时
定时执行产生的输出和或错误会以邮件形式发给MAILTO指定的用户或地址上(mail –u root),若不需要产生的结果,可以将MAILTO设为空或者将结果丢弃(> /dev/null 2>&1)
只设置系统时间 date -s “2013-10-15 17:15:00“
还原系统时间 hwclock –hctosys
环境变量
HOME
PATH
USER
SHELL
EDITOR
VISUAL
MAILTO
……
自定义
权限
A: /etc/cron.allow 若该文件存在且用户名不在此文件内,则不允许使用crontab命令
B: /etc/cron.deny 拒绝使用crontab命令的用户列表,若文件A存在,则忽略该文件的设置
C: 如果A和B文件都不存在那么只有root用户才可以设置定时
# touch /etc/cron.allow
# useradd crontest
# su – crontest
$ crontab -e
…
# echo “crontest” >> /etc/cron.allow
…
$ crontab -e
…
# echo “crontest” >> /etc/cron.deny
…
$ crontab – e
…
# rm /etc/cron.allow
…
$ crontab -e
cron守护
启动cron
设置初始时间
执行reboot任务(即@reboot的任务)
……
初始数据库
载入/etc/crontab
载入/var/spool/cron/xxx
while(TRUE)守着
Sleep 65秒左右
收集待执行任务到任务队列 & 执行任务队列
检查数据库是否有更新
cron数据结构
◇用户
user
next 下一用户
prev 上一用户
name 用户名
mtime 用户定时列表的最后修改时间
crontab 用户定时列表(entry)
◇用户定时列表
entry
next 下一条定时
pwd 用户信息包含用户名、ID、组ID、主目录等
envp 环境变量
cmd 要执行的命令
minute[8] 分
hour[3] 时
dom[4]日
month[2]月
dow[1]周
……
◇cron数据库
cron_db
head 第一个用户(数据库第一条记录)
tail 最后一用户(数据库最后一条记录)
mtime 数据库最后修改时间(默认即/var/spool/cron修改时间)
◇任务
job
next 下一任务
e 定时列表
u 所属用户
◇任务队列
jhead 队头(job)
jtail 队尾(job)
载入数据
项目中
1、crontab.sh.php
* * * * * /bin/sh /xxx/crontab.sh.php > /dev/null 2>&1
2、udp.sh.php
* * * * * /bin/sh /xxx/udp.sh.php > /dev/null 2>&1
3、其他