我想把剧本安排在每个月的最后一个星期六。我想出了以下几点:
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 天进行检查,以便每周六在您想要的时间运行它。