首先说说全局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