调整每月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
相关产品推荐
相关产品推荐

