在每月第一个工作日运行 cron 作业

在每月第一个工作日运行 cron 作业

我尝试在每个月的第一个工作日使用以下 crontab 条目运行一项作业:

00 07 1-3 * * [ "$(date '+\%a')" == "Mon" ] && echo "Its Monday!"
00 07 1 * * [ "$(date '+\%a')" == "Tue" ] && echo "Its Tuesday!"
00 07 1 * * [ "$(date '+\%a')" == "Wed" ] && echo "Its Wednesday!"
00 07 1 * * [ "$(date '+\%a')" == "Thu" ] && echo "Its Thursday!"
00 07 1 * * [ "$(date '+\%a')" == "Fri" ] && echo "Its Friday!"

但是今天早上我收到以下错误:

/bin/sh: 1: [: Thu: unexpected operator

答案1

man test

   STRING1 = STRING2
          the strings are equal

请注意,是=,而不是==。然而,这不是唯一的问题……

firas@itsuki ~ % sh
$ [ "$(date '+\%a')" == "Thu" ] && echo "Its Thursday!"
sh: 1: [: \Thu: unexpected operator
$ [ "$(date '+\%a')" = "Thu" ] && echo "Its Thursday!"
$

另一个问题是,由于你的date字符串+\%a位于单身的引号,它将被按字面解释,所以

$ date '+\%a'
\Thu

这不是你想要的。你应该删除不必要的反斜杠,然后

$ [ "$(date '+%a')" = "Thu" ] && echo "Its Thursday!"
Its Thursday!

答案2

我正在寻找一种在 java quartz CronTrigger 中执行此操作的方法,最后找到了这个页面。不确定这是否适用于常规 cron,但 quartz 支持0 7 1 1W * ?每月第一个工作日的表示法。我把它写在这里以备将来使用。

0 7 1 1W * ?

  • 0
  • 分钟7
  • 小时1
  • 1W最接近每月第一天的星期几
  • *
  • 星期几?没有具体值

另请参阅org.quartz.CronExpression 的 javadoc

答案3

问题在于您使用的代码中混合了语法和合适的命令,而不是设置的方式cron。对于您要实现的目标,bash 代码应该真正使用if这样的语句:

if [[ "$(date '+\%a')" == "\Thu" ]]; then echo "Its Thursday!"; fi

(请注意额外的方括号、分号的使用以及终止fi条目)。

其结果如下:

chris@loki:/$ if [[ "$(date '+\%a')" == "\Thu" ]]; then echo "Its Thursday!"; fi
Its Thursday!

值得注意的是,在您的代码中,布尔值&&并不合适,因为它实际上应该用于字符串条件语句。例如:

if [ $condition1 ] && [ $condition2 ]

希望这就是您所追求的!

相关内容