我想知道 是否L
是 Debian 的 cron 实现中允许的特殊字符之一?我正在尝试设置一个 cron 在每个月的最后一天运行。
“L”代表“最后”。当在星期几字段中使用时,它允许您指定给定月份的“最后一个星期五”(“5L”) 等结构。在日期字段中,它指定该月的最后一天。
注意:L是非标准字符,仅存在于某些cron实现中(Quartz java调度程序)
如果没有,你会如何设置一个 cron 在每个月的最后一天运行?您会推荐 3 个不同的条目吗?stackoverflow 上的这个解决方案?
答案1
Debian 上的 Cron 条目在 crontab 手册页 ( man 5 crontab
) 中进行了描述。 Debian 使用 Vixie 的 cron,他的手册页显示:
The crontab syntax does not make it possible to define all possible
periods one could image off. For example, it is not straightforward to
define the last weekday of a month. If a task needs to be run in a spe-
cific period of time that cannot be defined in the crontab syntaxs the
best approach would be to have the program itself check the date and
time information and continue execution only if the period matches the
desired one.
If the program itself cannot do the checks then a wrapper script would
be required. Useful tools that could be used for date analysis are ncal
or calendar For example, to run a program the last Saturday of every
month you could use the following wrapper code:
0 4 * * Sat [ "$(date +%e)" = "`ncal | grep $(date +%a | sed -e 's/.$//')
| sed -e 's/^.*\s\([0-9]\+\)\s*$/\1/'`" ] && echo "Last Saturday" &&
program_to_run
因此,沿着这些思路工作:
0 0 * * * perl -MTime::Local -e
'exit 1 if (((localtime(time()+60*60*24))[3]) < 2);' || program_to_run
答案2
我从来没有L
在 Linux 的 cron 实现上看到过这样的情况。
要在该月的最后一天运行作业,请在实际天数的超集上运行它并检查第二天的日期。使用 GNU date
,您可以用来date -d tomorrow
显示第二天的日期,因此检查它是否仍在同一个月。为了避免在夏令时开始或结束的一天中的某些位置出现问题,请指定一天中非凌晨的时间(示例中为 12:00/中午)。请记住,这%
在 crontab 中很特殊,需要用反斜杠保护。
42 1 28-31 * * if [ "$(date -d 'today 12:00' +\%m)" != "$(date -d 'tomorrow 12:00' +\%m)" ]; then last_day_of_month_job; fi
您可以对该月中一周中特定日期的最后一次出现应用相同的技术。每周运行该作业,并且仅当下一次发生在不同月份时才会触发该作业。
42 1 * * 3 if [ "$(date -d 'today 12:00' +\%m)" != "$(date -d 'now + 7 days 12:00' +\%m)" ]; then last_wednesday_of_month_job; fi
答案3
我想通过实验来检查这一点有点尴尬,因为这需要改变你的时钟。
Debian 使用维克西克罗恩实现,维基百科文章中提到了这一点。 crontab 表达式的格式在 中进行了解释man 5 crontab
,这有点棘手,因为man crontab
不是同一件事(默认第 1 节是命令crontab
,第 5 节是“crontab”文件的格式)。
它没有提到“L”。
WRT SO 的替代方案,检查的答案是最容易遵循的,并且不需要外部脚本等。OTOH,它确实有闰年问题......
答案4
我的脚本具有该功能,它不是本机 cron,但可以解决问题。
http://xr09.github.io/cron-last-sunday/
例子:
# every last sunday
30 6 * * 7 root run-if-today L && /root/myscript.sh
# every third tuesday
30 6 * * 2 root run-if-today 3 && /root/myscript.sh