Cron不在特定日期运行,而是在所有其他日期运行


8

我有一个cron设置,每天晚上10点执行bash脚本。我还有另一个cron设置,要在每月的1号运行。两个克朗都启动bash脚本,bash脚本中唯一不同的是它们传递给底层Java程序的参数(模拟Java程序的命令行启动)。

问题是,我需要以某种方式在每月的1号停用每日cron,以使两者都不会尝试在同一天运行。这可以自动执行吗?

我想我可以创建另一个bash脚本来在1日之前编辑cron,然后在备份内容之后再次编辑cron,但这似乎……不干净。


并非所有月份都有31天,这不会引起问题吗?
SnakeDoc


@suspectus提供的解决方案的一个很好的替代方案
SnakeDoc 2013年

2
或2月31日为“月”字段。
2013年

@ash-看到我的答案,这正是我的建议。
slm

Answers:


10

与@StephaneChazelas在评论中提出的解决方案类似,您可以在第3个字段中指定天数范围,作为您要在每月第1天之外每天运行的cron的范围。

以下两个条目将满足您的要求:

   0 22 1 * *      /path/to/script/1st_of_the_month.bash    
   0 22 2-31 * *   /path/to/script/every_day_except_1st.bash

实际上,这似乎对我不起作用(除非我做错了事)-注释中的格式很糟糕-因此请查看我的pastbin以获取我的信息:pastebin.com/RKvy5d4e
SnakeDoc

糟糕,在您的示例中应为0 22 2-31 * *。我会编辑。
SnakeDoc

1
@SnakeDoc-谢谢,所有这些列在一段时间后开始融合8
slm

是的,我也忘记了它们–我进行了设置,然后忘记了我是怎么做的(对手册页来说是一件好事,大声笑)
SnakeDoc

8

解决此问题的最简单方法是只有一个cron条目。修改bash脚本以检查日期-如果它是每月的1号,则使用每月参数调用Java程序,否则使用每日参数调用程序。

更改脚本使过程更简单,因为脚本作为文档可以更好地描述正在发生的事情,而无需在cron表中提供其他信息。

脚本模块可能看起来像这样:

if [ $(date '+%d') == "1" ];then
   # monthly code
else
   # daily code
fi

1
最终采用了这种解决方案。我创造了另一个bash脚本与你的示例代码,并在每月的-它会揭开序幕,每月bash脚本(这反过来饲料月度参数的基本Java程序),日拉开战幕的日常脚本等
SnakeDoc

0
if [ $(date '+%d') == "1" ];then
  # monthly code
else
   # daily code
fi

我认为使用整数比较如果更正确

日期'+%d'返回01而不是1,因此使用==字符串比较将为false

代替

if [ $(date '+%d') eq 1 ];then
    # monthly code
else
   # daily code
fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.