如何设置 cron 表达式以在每月第一个工作日(周一至周五)和第一个周末(周六至周日)运行?

如何设置 cron 表达式以在每月第一个工作日(周一至周五)和第一个周末(周六至周日)运行?

我尝试了周末(周六至周日)的 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

相关内容