【发布时间】:2017-12-18 22:03:20
【问题描述】:
我需要cron 来跳过每个月的第一个星期六。我知道我们可以使用以下命令在特定日期运行,但是有没有办法跳过每个月的特定日期?
//每个月的第一个星期一运行
0 2 * * 1 [ date '+\%m' == date '+\%m' -d "1 week ago" ] || /path/to/command
【问题讨论】:
我需要cron 来跳过每个月的第一个星期六。我知道我们可以使用以下命令在特定日期运行,但是有没有办法跳过每个月的特定日期?
//每个月的第一个星期一运行
0 2 * * 1 [ date '+\%m' == date '+\%m' -d "1 week ago" ] || /path/to/command
【问题讨论】:
您的命令是二进制文件还是脚本? 在开头添加类似内容的想法如何:
[ $(date | awk '{print $1}') == "Sat" ] && exit 1 || { \
# your code here
...
}
【讨论】:
因为 Cron 中似乎没有选项。 我将使用脚本来满足上述需求。
**if [ $(date +%d) -le 7 ] && [ $(date +%u) -eq 1 ] ;**
[ $(date +%d) -le 7 ] - 检查天数是否在每月的前 7 天
[ $(date +%u) -eq 6 ] - 检查一天是否等于星期六
谢谢。
【讨论】:
以下在 cron 中有效(不要忘记转义 %):
0 2 * * * [[ `date '+\%u'` -ne '6' && `date '+\%d'` -lt '8' ]] || [[ `date '+\%d'` -gt '7' ]] && /path/to/command
逻辑是:
另一种方法是反转逻辑:
0 2 * * * [[ ! ( `date '+\%u'` -eq '6' && `date '+\%d'` -lt '8' ) ]] && /path/to/command
逻辑是:
man 5 crontab“第六”字段(该行的其余部分)指定要运行的命令。行的整个命令部分,直到换行符或 “%”字符,将由 /bin/sh 或 cronfile 的 SHELL 变量中指定的 shell 执行。命令中的“%”字符,除非用反斜杠 (\) 转义,否则将更改为换行符,第一个 % 之后的所有数据都将作为标准输入发送到命令。
【讨论】:
date '+%u' -ne '2' && date '+%d' -lt 17 ] || [date '+%d' -gt 17] && //script.sh。编辑上述命令以立即触发脚本和测试。但它不起作用。我做错了什么吗?如果我没记错,它必须运行脚本。
[[ `date '+\%u'` -ne '2' && `date '+\%d'` -lt 17 ]] || [[ `date '+\%d'` -gt 17 ]] && echo foo > ~/foo.txt 2> ~/foo.err
0 17 * * 5 [[ ! ( `date '+\%u'` -eq '5' && `date '+\%d'` -lt '8' ) ]] && /usr/bin/python3 test.py这对我不起作用,无法弄清楚我做错了什么,你能帮忙吗?通过 'escape the %',您是否要求删除 % ?