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

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

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

问题是,我需要以某种方式禁用每月 1 日的每日 cron,这样两者就不会尝试在同一天运行。这可以自动完成吗?

我想我可以创建另一个 bash 脚本来在第一个之前编辑 cron,然后在设置备份之后再次编辑 cron,但这似乎......不干净。

答案1

与 @StephaneChazelas 在评论中提出的解决方案类似,您可以将第三个字段中的天数范围指定为您想要在每月 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

答案2

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

更改脚本使过程更简单,因为脚本作为文档将更好地描述正在发生的情况,而不需要 cron 表中的其他信息。

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

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

答案3

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

我认为使用整数比较是否更正确

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

反而

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

相关内容