我尝试了周末(周六至周日)的 cron 表达式:
0 0 18 ? 1/1 SAT#1,SUN#1 *
但它不起作用。
答案1
你没有说你正在使用哪个 CRON 版本,但从我有限的经验来看,一般来说 CRON 配置是 -
分钟 小时 天 月 星期几 后面跟着要执行的命令
因此在每月的第一天,这将是 0 0 1 * *,而不是以 0 0 18 开头
一个解决方案是,你可以使用 bash case...esac 语句的语法
0 0 1,2,3 * * case `date "+\%w\%d"` in \\[1-5]\\01|\\1\\02|\\1\\03) /path/to/your/script ;; esac
然后根据表达式的“case word in”值检查 cron 条目,直到找到匹配项。如果没有匹配项,则将使用默认条件。
Bash 基本日期格式 $date“+ 其中参数来自下面的列表,分隔符是任何字段分隔符,如连字符(-)、斜杠、冒号:并且它是可选的。
Bash 日期格式示例 %d 是两位数日期的关键字 %w 以星期日(0)开始的星期几,即 smtwtfs(注意,星期日可以是 0 也可以是 7)。
在这里,将字符串 word 与每个模式进行比较,直到找到匹配项。匹配模式后面的语句将执行。如果没有找到匹配项,case 语句将退出而不执行任何操作。
当语句部分执行时,命令 ;; 表示流程应该跳转到整个 case 语句的末尾。
因此,如果日期是星期一至星期五的 01,或者(第 1 天)星期一是月份的 02 或 03,则在 00:00 时运行脚本,否则不执行任何操作
或者周末
0 0 1 * * case `date "+\%w\%d"` in \\0\\01|\\6\\01|\\6\\02|\\6\\03|\\6\\04|\\6\\05|\\6\\06|\\6\\07) /path/to/your/script ;; esac
否则,但并非所有 CRON 都以相同的方式工作,您也可以尝试以下选项。
每周六或周日(1 日至 7 日)
0 0 1-7 * 6,7
0 0 1-7 * SAT,SUN
每月第一个工作日
0 0 1W * *
第一个星期六或星期日(如果是 1 日至 7 日)
0 0 1-7 * 6#1,7#1
0 0 1-7 * SAT#1,SUN#1