每个月最后一个星期六的 Cron 条目

每个月最后一个星期六的 Cron 条目

我想把剧本安排在每个月的最后一个星期六。我想出了以下几点:

45 23 22-28 * *  test $(date +\%u) -eq 6 && echo "4th Saturday"  && sh  /folder/script.sh 

这是正确的还是我需要更改它?我现在无法测试它,因为它只会在上周六调用。请指教。

我每个月最后一个星期日都有以下内容,但我不太明白其中的内容。第一部分给出 24,这是星期日,之后 -eq 给出 7,我不知道这意味着什么:

00 17  * * 0 [ $(cal -s | tail -2 | awk '{print $1}') -eq $(date | awk '{print $3}') ] && /folder/script.sh

我可以修改上面的内容以获取上周六吗?

在罗密欧的帮助下我得到了以下答案:

00 17 * * 6 [ $(cal -s | tail -2 | awk '{print $7}') -eq $(date | awk '{print $3}') ] && /folder/script.sh

答案1

你的逻辑行不通。月份的最后一个星期六可以是 29 日、30 日或 31 日。因此,执行检查的最佳方法是每星期六运行一次,并检查脚本(如果这是该月的最后 7 天):

45 23 * * 6  sh  /folder/script.sh 

date并在你的脚本中添加如下内容(这里假设是 GNU 实现):

if [ "$(date -d "+7 day" +%m)" -eq "$(date +%m)" ]
then echo "This is not one of last 7 days in month.";exit
fi
<rest of your script>

关于 cron 中的行,您应该将其编辑为这样开始:

00 17  * * 6

(6 表示星期六,0 或 7 表示星期日)

答案2

如果您碰巧使用 Dillon Crontab(我认为它更好,包含更多功能,并且还提供 anacron),那么您可以选择:

如果您同时指定月份中的某一天和星期几,则它将被解释为该月中的第 N 个这样的日子。

45 23 5 * 6  /path/script.sh

要请求一个月中的最后一个星期一等,请请求“第 5 个”星期一。这将始终与最后一个星期一等匹配,即使该月只有四个星期一

希望您和其他人可以使用此答案进行将来的咨询。


参考:

答案3

而其余的答案是按照您提出问题的方式构建的(通过 cronjob)。

值得注意的是,这就是 systemd 计时器存在的原因。他们有更强大的调度。

您创建一个 systemd 服务和匹配的计时器,而不是 cronjob。

在计时器中使用 OnCalendar

OnCalendar=Sat *-*~07/1 23:45:00

或者更详细地说...

OnCalendar=Sat *-1,3,5,7,8,10,12-25..31 23:45:00
OnCalendar=Sat *-4,6,9,11-24..30 23:45:00
OnCalendar=Sat *-2-22..29 23:45:00

https://www.freedesktop.org/software/systemd/man/systemd.timer.html

https://www.freedesktop.org/software/systemd/man/systemd.time.html

https://wiki.archlinux.org/title/Systemd/Timers

https://documentation.suse.com/smart/linux/html/task-create-systemd-timers/index.html#id-1.5

答案4

00 01 * * 6 [ $(date +\%d) -gt $(date \-d "-$(date +\%d) days month -7 days" +\%d) ] && /run/my/script

$(date +%d) 是当天

$(date -d "-$(date +%d) days Month -7 days" +%d) 是“减去本月的天数(因此上个月的最后一天)加上一个月,减去 7 天。”

因此,在 2023 年 2 月 14 日运行我们得到:

[ 14 -gt 21 ] && /run/my/script

所以它不会运行。

在第 6 天进行检查,以便每周六在您想要的时间运行它。

相关内容