【发布时间】:2013-05-06 02:19:43
【问题描述】:
我有一个表单,用户可以在其中选择何时运行脚本。我有fields {time,day of week, first/last}。现在当用户选择例如:每个第一个星期一上午 10:45 - 这意味着在每个月的第一个星期一运行脚本,我如何将其转换为 cron 作业。
谢谢。
【问题讨论】:
-
在下面回答,但这属于超级用户,而不是 stackoverflow。
标签: cron
我有一个表单,用户可以在其中选择何时运行脚本。我有fields {time,day of week, first/last}。现在当用户选择例如:每个第一个星期一上午 10:45 - 这意味着在每个月的第一个星期一运行脚本,我如何将其转换为 cron 作业。
谢谢。
【问题讨论】:
标签: cron
不幸的是,crontab 条目中的日期和星期几字段是 ORed 在一起的,而不是 ANDed。所以你不能真的只用 crontab 字段来做一个“每月的第一个星期一”;你需要额外的逻辑。你可以这样做:
min hr 1-7 * * [ `date +%w` -eq 1 ] && first-monday.sh
查找工作日的最后一个实例有点棘手,因为它取决于一个月中有多少天:
min hr 25-31 1,3,5,7,8,10,12 * [ `date +%w` -eq 5 ] && last-friday.sh
min hr 24-30 4,6,9,11 * [ `date +%w` -eq 5 ] && last-friday.sh
min hr 22-28 2 * [ `date +%w` -eq 5 ] && last-friday.sh
在 2 月 29 日为星期五的闰年,最后一个条目实际上将在 22 日运行脚本,但由于 cron 作业无法指定年份,所以这大约是您可以得到的最接近的时间。
【讨论】:
min hr 1-7 * 1 first-monday.sh 实际上会在每月的前 7 天和每周一执行。该网站 (pantz.org/software/cron/croninfo.html) 给出了以下说明:命令执行的日期可以由两个字段指定 - 月份的日期和星期几。如果两个字段都受限制(即不是 *),则当任一字段与当前时间匹配时,将运行该命令。例如,“30 4 1,15 * 5”将导致在每个月的 1 日和 15 日以及每个星期五的凌晨 4:30 运行命令。