You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调整每月30日执行的Cron任务:非30天月份跨月执行方案问询

优雅的crontab实现方案

针对你的需求——每月15号固定执行,30号执行(若当月无30号则次月1号执行),这里有两种比脚本内判断更优雅的crontab原生方案:

方案1:拆分独立crontab条目(推荐,可读性拉满)

这种方式把每个执行场景拆成单独的crontab行,逻辑清晰到一眼就能看懂:

# 每月15号9:12固定执行
12 9 15 * * /home/run_ps.sh
# 1月、3-12月的30号9:12执行(避开没有30号的2月)
12 9 30 1,3-12 * * /home/run_ps.sh
# 3月1号9:12执行(补上2月本该在30号执行的那次任务)
12 9 1 3 * * /home/run_ps.sh

为什么这么写?因为全年只有2月没有30号,所以只需要单独给3月1号加一条,补上2月的遗漏任务。其他月份的30号正常执行,15号全月覆盖,完全不需要修改脚本的任何内容。

方案2:单条带bash条件判断(条目少,逻辑内聚)

如果你偏好只用一条crontab行,可以借助bash -c嵌入日期判断逻辑,直接在crontab里完成场景过滤:

12 9 1,15,30 * * bash -c '
  # 匹配15号(任意月份)、30号(任意月份)、3月1号(补2月的任务)
  case "$(date +%d%m)" in
    15*|30*|0103) /home/run_ps.sh ;;
  esac
'

这里用date +%d%m输出日+月的格式(比如1502代表2月15号,0103代表3月1号),通过case语句精准匹配符合要求的日期组合,只有匹配成功时才执行脚本。

为什么这两种方案更优雅?

相比在脚本里嵌入日期判断,这两种方案都把调度逻辑留在了crontab层面,让脚本只专注于执行核心业务任务,完美符合“职责分离”的设计原则。其中方案1的可读性最佳,适合需要长期维护的团队场景;方案2则适合追求条目简洁的个人使用场景。

内容的提问来源于stack exchange,提问作者3pitt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:32:03