Cron 在 Debian 上允许使用特殊字符“L”表示“本月最后一天”

Cron 在 Debian 上允许使用特殊字符“L”表示“本月最后一天”

我想知道 是否L是 Debian 的 cron 实现中允许的特殊字符之一?我正在尝试设置一个 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

相关内容