定制时间表cron 时间表允许以多种方式运行作业,比如每分钟或在特定日期的特定时间。调度的参数非常灵活。
cron 字段可以通过五个字段调整频率:分、小时、月中日、月份和周中的日期(如周一,周二)。 总结如何调整每个字段。
表 1. cron 作业的调度选项位置字段值说明1分0-59
2小时0-23
3月中日1-31与分和小时不同,月中日不是从零开始的。4月份1-12月份也不是从零开始的。也可以不使用 1-12 的数字,而是使用月份名的前三个字母,比如 jan 或 may。 5周中日0-70和7 都代表星期日。还可以使用名称的前三个字母,比如 mon 或 wed。
除了名称或数字之外,还可以使用星号(*)表示 “所有”。例如,在分钟位置上的星号表示这一天中的每一分钟。(在某些情况下确实需要如此高的频率,但是一定要小心,以这种频率执行的任务应该非常简单,不会长时间运行)。
还可以使用值的列表、范围和步长(增量)分别指定多个值、连续的值范围和不连续的值范围。甚至可以组合使用列表和范围。列表 是一个逗号分隔的值集。范围 由启始值和结束值(含)以及可选的步长值构成。
我们来看一些示例。 中的每一行包含一个时间表及其说明。当分、小时和日期字段与当前时间匹配时,cron 会执行命令;如果月中日和周中日受到限制(也就是说,不是 *),那么当这两个字段中至少一个 与当前时间匹配时,cron 也会执行命令。
表 2. cron 作业的时间表示例调度计划
分小时月中日月份周中日期说明01151,3,5,7,9,11*在 1、3、5、7、9 和 11 月的 15 日的 1 a.m. 运行命令。为了更容易理解,也可以把这个时间表写成 0 1 15 jan,mar,may,jul,sep,nov *。在指定列表时,不要在逗号后面加空格。 0-59/15****这个调度计划每 15 分钟运行命令一次。 30***wed,fri这个时间表只在星期三和星期五每小时的 30 分时执行命令一次。(在列表中可以使用日和月份的名称,但是在范围中不可以)。 0,300-5,17-23***在午夜到 5 a.m. 以及 7 p.m. 到 11 p.m. 之间整点时和 30 分时运行命令。 0011*在每年 1 月 1 日午夜执行命令一次。00**0在每个星期日午夜运行命令。这相当于每周一次。 30010,20,30*6因为月中日和周中日受到限制,这个时间表在每星期六和每月的 10、20 和 30 日(二月除外)的 12:30 a.m. 运行命令。 如您所见,实际上可以使用这五个参数指定任何调度计划。为了更加简便,Vixie cron 还提供了常用调度计划的简写形式。表 3 列出一些简写形式。
表 3. 常用调度计划的简写形式简写形式说明@reboot每当计算机重新引导时运行命令。@daily每天一次的简写形式。@weekly每周一次的简写形式。@annually每年一次的简写形式。也可以写成 @yearly。 @midnight在每天午夜运行命令。这个简写形式相当于 @daily。
如果喜欢使用简写形式,只需用它们替代 cron 命令的前五个字段。下面这个命令看起来简单多了。
1
| @daily root /usr/local/scripts/clean_old_files.sh
|
crontab 命令示例掌握了基本概念之后,我们来看一些用户 crontab 命令示例。同样的命令也可以应用系统范围:只需在所有系统 crontab 项中周中日字段(第五个字段)后面指定一个用户名。
创建个人 crontab要想创建个人 crontab,可以用任何文本编辑器创建一个文件。按照惯例,个人 crontab 文件保存在 ~/.crontab 中,但是可以使用任何文件名。
1
2
3
4
5
6
7
8
9
| PATH=/usr/bin:/bin:/usr/local/bin
#
# Every day, print and delete all temporary files whose names begin with '.#'
@daily find $HOME -type f -name '.#*' -print -delete
#
# Every week, show me what is consuming space in my home directory
@weekly du -sh $HOME
|
通过 crontab 实用程序提交个人 crontab在编辑文件(比如 ~/mycrontab)之后,通过 crontab 实用程序把它提交给 cron:
查看 cron 中存储的信息要想查看 cron 中存储的信息,可以输入 crontab -l:
1
2
3
4
5
6
7
8
9
10
| % crontab -l
PATH=/usr/bin:/bin:/usr/local/bin
#
# Every day, print and delete all temporary files whose names begin with '.#'
@daily find $HOME -type f -name '.#*' -print -delete
#
# Every week, show me what is consuming space in my home directory
@weekly du -sh $HOME
|
替换 crontab在任何时候,都可以使用 crontab 实用程序替换您的 crontab。只需提交一个新文件或同一文件的修订版。要想删除 crontab 作业,只需输入 crontab -r:
1
2
3
4
5
6
7
8
9
10
| % whoami
joe
% crontab ~/mycrontab
% crontab -l
PATH=/usr/bin:/bin:/usr/local/bin
...
% crontab -r
% crontab -l
crontab: no crontab for joe
|
|