我想编写一个 crontab 条目,在每个月的最后一周每 30 分钟运行一次。我知道要在最后一个星期日执行,例如 cron 是:
0 0/30 * ? * 0L
当我尝试用逗号分隔星期几字段时,如下所示:
0 0/30 * ? * 0L,1L,2L,3L,4L,5L,6L
我收到一个错误:
Support for specifying 'L' with other days of the week is not implemented
有没有办法简化这个 crontab 表达式,或者我是否需要创建 7 个单独的 crontab 条目,每个条目代表不同的日期?
答案1
错误消息表明您无法执行此操作。您必须让脚本检查今天是否在本月的最后一周内,然后按要求退出/继续。
#!/bin/bash
MonthDays=$(echo $(cal) | awk '{print $NF}')
Today=$(date '+%d')
let DaysLeft=MonthDays-Today
if [ $DaysLeft -gt 6 ]
then
exit 1
fi
echo "Run the rest of the script"
或者,您可以在 crontab 中使用以下脚本 - 将其另存为last-week
#!/bin/bash
MonthDays=$(echo $(cal) | awk '{print $NF}')
Today=$(date '+%d')
let DaysLeft=MonthDays-Today
if [ $DaysLeft -gt 6 ]
then
exit 1
fi
像这样使用
0,30 * * * * last-week && your-script
your-script
如果last-week
脚本以 0 状态退出则运行。
答案2
如果您想要真正的“上周”(从每月的最后一个星期日到剩下的时间),请对@Iain 的脚本进行一些更改:
#!/bin/bash
Today=$(date +%d)
LastSun=$(ncal | awk 'NR==2 { print $NF }')
if [ $Today -ge $LastSun ]
then
exit 1
fi
以同样的方式使用它。