首页/系统/Linux 运维命令速查/cron 实现每月最后一天等复杂日历
定时任务与计划50 条

cron 实现每月最后一天等复杂日历

cron 五字段表达不了「最后一天」「第一个工作日」:用日期判断、多行组合或交给 systemd OnCalendar 的 ~ 语义。

Linux 运维命令速查系统更新于 2026-10-12
用途实现非固定日历的调度
手法date 判断 / 多行组合 / OnCalendar

最后一天写法

最后一天写法
# 每天跑,只在明天是 1 号时执行(即今天是月末)
0 8 * * * [ "$(date -d tomorrow +\%d)" = 01 ] && /opt/scripts/month-end.sh

# 多行组合:覆盖 28/29/30/31 且判断月末(冗余触发靠脚本内判断去重)
0 8 28-31 * * [ "$(date -d tomorrow +\%d)" = 01 ] && /opt/scripts/month-end.sh

systemd 写法

systemd 写法
# ~ 表示当月最后一天(systemd 236+)
OnCalendar=*-*-~1 08:00:00
每周第几天、每月第几个周一同理:把判断放进脚本最通用,OnCalendar 语法更简洁但可移植性要求 systemd 版本。

易错点

  • date -d 是 GNU coreutils 特性,BSD/macOS 用 -v1d,跨平台脚本要区分
  • 用 28-31 日多天触发时必须在脚本里去重,否则一个月跑多次

数据来源与参考

  • man 5 crontab(无法表达的点)
  • systemd.time(7):~ 语义
  • man 1 date

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌