初识 linux crontab

简单定义

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修改时间)

TIP

◇任务

job
next  下一任务
e  定时列表
u  所属用户

◇任务队列

jhead 队头(job)
jtail  队尾(job)

载入数据

TIP2

项目中

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、其他

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注