Answers:
您可以将条件放入实际的crontab命令中:
[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"
现在,如果在一个月的前七个天之一中满足此条件,则您拥有了第一个星期一。请注意,在crontab中,虽然需要转义百分比语法:
0 12 1-7 * * [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"
将echo
命令替换为要运行的实际命令。我也找到了类似的方法。
[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"
一样[ $(date '+%a') = "Mon" ] && echo "It's Monday"
但是,在crontab似乎在这个测试中失败。我也无法从cron那里获得任何有用的反馈:我正在尝试[ "$(date '+%a')" = "Tue" ] >> /home/deploy/cron.log 2>&1
将任何错误输出捕获到日志中,但这也不起作用:/
date
输出是否正确吗?例如,只需要cron
运行一个将其输出到文件的命令即可:date '+%a' > ~/datetest 2>&1
–然后检查是否生成了正确的字符串以进行比较。
+%a
需要逃跑时,它是在crontab,即是此需要的行: [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"
。如果您可以更新答案,这对以后的读者会有所帮助:)再次感谢
当不需要处理日数时,我发现它更容易。
在每月的第一个星期一运行:
0 2 * * 1 [ `date '+\%m'` == `date '+\%m' -d "1 week ago"` ] || /path/to/command
例如,如果一周前的月份与当前月份不同,那么我们在该月的第一天1(=星期一)。
同样,对于第三个星期五
0 2 * * 6 [ `date '+\%m'` == `date '+\%m' -d "3 weeks ago"` ] || /path/to/command
例如,如果3周前的月份与当前月份不同,则我们位于该月份的第3天6(=星期五)
据我所知,不可能仅使用crontab,但是可以使用包装器功能从“一个月的前7天” contab条目中选择正确的日期。从条目中看到这一点。
包装脚本将是
#! /usr/bin/ksh
day=$(date +%d)
if ((day <= 7)) ; then
exec somecommand
fi
exit 1
并且您需要使用crontab条目运行它(假设它被称为wrapper.sh并且全局可用)
0 0 * * 1 wrapper.sh
我为此类问题提供了一个通用的解决方案,它适用于本月的最后一个工作日的第一,第二,第三.....。
您可以像这样使用它:
30 06 * * Mon run-if-today 1 "Mon" && echo "First Monday"
30 06 * * Thu run-if-today 3 "Thu" && echo "Third Thursday"
30 06 * * Sun run-if-today L "Sun" && echo "Last Sunday"
脚本如果今天运行,则检查工作日和所需的星期日期范围,如果两者都匹配,则返回0,否则返回1。
我相信这可以更优雅地解决问题:
30 8 1-7 * 1 /run/your/job.sh