about GNU Cron

发表于:2007-05-25来源:作者:点击数: 标签:GNUCronAbout
about GNU Cron 实验通过环境:FreeBSD+RedHat+Debian cron目前应用得最广泛的就是Paul Vixie写的Vixie Cron,基本上来说它的文件格式是可读的. 要使用cron首先你必须确保你的系统启动了cron服务(不同的系统对cron的名称也有一些差别,最好是|grepcron来确定一
about GNU Cron


实验通过环境:FreeBSD+RedHat+Debian

cron目前应用得最广泛的就是Paul Vixie写的Vixie Cron,基本上来说它的文件格式是可读的.

要使用cron首先你必须确保你的系统启动了cron服务(不同的系统对cron的名称也有一些差别,最好是"|grep cron"来确定一下),启动服务的方式可以参照前文<<初探FreeBSD与Linux的预处理机制>>的内容.确定启动该服 务后,有两种方法实施cron任务加载:
1)全局cron服务(主文件/etc/crontab)
2)存放在/var下的用户级别"cron*"目录(使用/usr/bin/crontab命令进行维护)

首先说说全局cron服务(主文件/etc/crontab),可能有不少人在开始时会把它与/usr/bin/crontab这个命令之间的关 系混淆了(PS:包括我自己...),其实它们是两个概念来的.之所以说它是全局文件是因为系统会优先读取这个文件的内容,读取的机制是每分钟"唤醒"一 次这个文件进行时间匹配,一旦有匹配时间的任务需要进行则运行它.

debian:~# cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
25 6 * * * root test -e /usr/sbin/anacron || run-parts --report /etc/cron.daily
47 6 * * 7 root test -e /usr/sbin/anacron || run-parts --report /etc/cron.weekly
52 6 1 * * root test -e /usr/sbin/anacron || run-parts --report /etc/cron.monthly

上面的第一个作用行的"SHELL"这个值是指运行下面的command一行命令所用的环境;第二行的"PATH"值是指下面command默认的路径地址.下面是一段类似表格的数据,以空格(空格段)区分不同的参数,按找顺序排列的是:
分钟 小时 日期(按一个月里来计算) 月 日期(按星期计算) 运行者的ID 命令行
系统本身为该文件定义了三个CRON目录cron.daily、cron.weekly、cron.monthly(BSD下这三个文件需要手工 创建),你可以把自己手写的SHELL脚本放在这三个目录中使其可以按crontab中定义的时间周期运行(但并不推崇这样做,因为这些目录都是为系统级 别服务准备的).

再说说存放在/var下的用户级别"cron*"目录(之所以要用cron*来表示,并加上双引号是因为这个目录的名称与路径会根据系统类型与发 行版本的不同而有所差异,找它的最好方法是find /var -type d -name "cron*" -print,加入后最后再用crontab -u USERNAME -l来确认一下),在系统启动时、加载cron服务会读入一个存放在/var下的cron目录,目录中的文件以用户的名称命名,这些文件的内容格式与 /etc/crontab一样,但有一点要注意的,就是它没有"user"那个参数列,"user"参数是代表运行"command"参数内容的用户身 份,在这里用该CRON文件命名的用户名就等同于"user"参数了,所以"user"省略了,格式:
分钟 小时 日期(按一个月里来计算) 月 日期(按星期计算) 命令行

要维护用户级别cron服务可以用到/usr/bin/crontab这个程序/命令,它的基本使用方式如下:
usage: crontab [-u user] file
crontab [-u user] { -e | -l | -r }
(default operation is replace, per 1003.2)
-e (edit user's crontab)
-l (list user's crontab)
-r (delete user's crontab)
上面的第一种使用格式用于导入某个在特定路径的CRON格式文件到某个用户(-u user)的cron任务列表中,当"-u user"这个参数项省略的话默认为当前登陆所使用的用户(引入另一个话题:没人能为其他人分配cron任务,除了root);"file"参数可以为任 何路径:
alex4# touch /var/cron/tabs/user
alex4# chmod 600 /var/cron/tabs/user
alex4# echo "04 * * * * ll&">/var/cron/tabs/user
alex4# crontab -u user -l
04 * * * * ll&
alex4# cat /home/user/cron.user
04 * * * * cp /etc/passwd /etc/passwd2&
alex4# crontab -u user /home/user/cron.user
alex4# crontab -u user -l
04 * * * * cp /etc/passwd /etc/passwd2&
alex4# cd /var/cron/tabs
alex4# ll
total 2
-rw------- 1 root wheel 246 Jun 26 23:29 user
alex4# cat user
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (cron.user installed on Sat Jun 26 23:29:07 2010)
# (Cron version -- $FreeBSD: src/usr.sbin/cron/crontab/crontab.c,v 1.12.2.4 2001/06/16 03:18:37 peter Exp $)
04 * * * * cp /etc/passwd /etc/passwd2&
从上面实验(上面的实验环境在FreeBSD下)可以看出:一旦导入新的cron任务列表文件,内存属于该用户原有的cron任务列表就会消失 (/var下的"cron*"下的用户级别cron任务列表文件也会被强制改写),如果你想在保留原 来的任务列表基础上加入新的任务可以参考第二种使用方法的-e参数.

第二种方法涉及到不同用户的cron任务列表的维护问题(动态添加、删除)了.这里列出了三个新的参数
-e 使用默认编辑器手动修改某用户的cron任务列表(用户级别cron任务列表文件也会被强制改写)
-r 动态删除某个用户的所有cron任务
-l 显示
上述三个参数当不与-u参数连用时则表示当前的用户.

另外,在用户级别cron的问题涉及到一个*.allow与*.deny权限管理文件的问题,这里需要注意几个点:
1)allow的优先级别要比deny高
2)当这两个文件都不存在时,只有root可以使用用户级别cron
3)根据系统与发行版本的不同,这两个文件的路径也有可以不同,最快的查找方法是从man crontab的"FILES"章节中查找

参考资料:
FreeBSD在线中文手册的cron部分:
http://www.freebsd.org.cn/snap/doc/zh_CN.GB2312/books/handbook/configtuning-cron.html

原文转自:http://www.ltesting.net