快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡萄app下载:更佳编程之路 第 11 章. 利用 cfperl 进行 crontab 管理



正如文章标题所示,本文是正在连载的系列文章中的一部分。建议您涉猎本系列 曩昔颁发的章节,以懂得 cfperl 的背景常识、理论根基和布局。

应用 cfperl 进行 crontab 治理是很抱负的,这样就可以用纯英语来描述 crontab 义务。cfperl 语法可以用一行来描述标准 crontab 中要用多行描述的内容(例如,那些在 5:30 和 6:00 运行的义务)。cfperl 应用标准的 cron 扩展来实现其 crontab 功能。

cfperl crontab 部分是用标准 cfperl 要领解析的,经由过程顶级解析器将“cron”部分指向特定的主机、组等等。

什么是 crontab?

cron 包由两个法度榜样构成:按期履行义务的 cron 守护法度榜样,以及改动小我用户的 cron 义务列表的 crontab 法度榜样。这两个法度榜样异常有用,假如您应用过 UNIX 系统,那么您可能据说过 crontab。用户的 cron 义务列表被称为 crontab,它就象用来改动该列表的法度榜样一样。我将评论争论标准的 cron 包,但不会评论争论因为 cron 重写而添加的所有扩展。颠末改进的 cron 包(如 anacron澳门新葡萄app下载、fcron 和 ucron)要优于标准的 cron,但遗憾的是,它们都对标准的 crontab 澳门新葡萄app下载款式进行了非标准的扩展。

在范例的 UNIX 风格中,标准的 crontab 款式异常有效率,然则异常不便于涉猎。六个字段(分钟、小时、日、月、礼拜几和敕令)是用空格分隔的。每个字段都有一个列数字或“*”;例如小时字段中的“0,1,2”意味着该敕令该当在午夜 0 点、1 点和 2 点运行。当某个字段中呈现“*”时,这意味着 cron 该当匹配该字段中的任何内容 — 任何小时、任何天、任何月等等。别的一个繁杂之处在于,礼拜几是从 0 开始计数的(礼拜天是 0),而每月的天数是从 1 开始计数的(从 1 到 31)。

礼拜几字段轻细有点繁杂,由于它不斟酌日字段。假如日是“*”而礼拜几是“0”,那么敕令将只在礼拜天运行。假如日是“1”,而礼拜几是“*”,那么敕令将只在该月的第一天运行。然则,假如日是“5”而礼拜几是“2”,那么敕令将在该月的第 5 天和礼拜二 都运行。

幸运的是,cfperl 使您无须记着所有那些器械 — 除非您对那类问题很感兴趣,假如是那样的话,cfperl 的 crontab 功能对您而言是毫无用场的,也不必用它来办理问题。它不是一种“爱出风头”的软件。澳门新葡萄app下载

在使 crontab 更易于治理方面,cfperl 能做些什么?

使用 cfperl,可以按照便于涉猎的规范天生 crontab。例如:

hourly澳门新葡萄app下载 at 0,10,20,30,40,50 do as cftest /usr/bin/synchronize

很简单,是吗?您必须做的所有事情便是指定功课履行的分钟字段,以及将编辑哪个用户(在本例中是“cftest”)的 crontab。这很轻易地转换成了一行 crontab:

0,10,20,30,40,50 * * * * CFPERL=1 /usr/bin/synchronize

请留意“CFPERL=1”部分;它向后续运行的 cfperl 指出:该行是由 cfperl 天生的,可以从新天生。

范围怎么样呢?例如,为 cfperl 供给的分钟范围“23-43,44-49”,在 crontab 中将天生“23-49”。

用户规范解析器

用于 crontab 项用户规范的解析器是 %parsers 散列(带有键“cron”)的成员。按照 cfperl 的常规,cfperl 设置设置设备摆设摆设中的“cron”部分将调用该解析器。

该解析器可以处置惩罚三种哀求:删除(delete)、删除整个(deletfull)和老例(regular)crontab 哀求。假如 cfperl 要清除用户的 crontab 中的旧项或整个 crontab 项,则可以应用删除。

用于“numeric_list”和“numeric_hour_list”规则的解析器规范是递归的。规则取决于其本身或 遣散符,这意味着终极它必须找到匹配规则交替(rule alternation)的文本,该规则交替不取决于规则本身。

假如感觉这让您利诱,那么请斟酌一列数字,例如“5,6,7”。您可以将该列表定义成“(1)一个数字,后面随着一个逗号,逗号后面再随着一个数字列表,或者(2)数字本身”。对付解析一列数字的一样平常规则,规则(1)和规则(2)是可以交替应用的办理规划。然则仅应用规则(2)是无用的,由于它只理解单个数字。另一方面,规则(1)不够以处置惩罚列表结尾处的问题,由于其尾端无逗号。假如要递归地解析数字列表,那么必须交替应用规则(1)和规则(2)。

解析项列表有其它许多措施,然则使用 Parse::RecDescent (它是递归的子代解析器),递归措施的效果是最佳的。它照样一种异常完美的措施,用几行就概括了对列表的所有可能的解释。请参考 Parse::RecDescent 文档,以获取更多有关递归解析器和规则的信息(请参阅 参考资料以获取链接)。

繁杂性的另一壁在于平铺(flatten)数组引用的代码。在某些地方,假如项的内容是数组引用,那么它们会被差别对待。这是由于将数组引用平铺成列表可以在解析器中完成。

数组引用本该当保留在解析器输出中,将由应用该解析器的代码进行解释。然则,将引用平铺成列表只会使解析器变得更为繁杂一些,而必须处置惩罚作为输澳门新葡萄app下载出的引用的代码则会变得相称繁杂。

我们感兴趣的一个规则便是“礼拜几”规则。

清单 3. 礼拜几

weekday_name: 'Monday' { 1 } | 'Tuesday' { 2 } | 'Wednesday' { 3 } |

'Thursday' { 4 } | 'Friday' { 5 } | 'Saturday' { 6 } |

'Sunday' { $return = 0; 1; }

您可能还会对下面的文章感兴趣: