Linux crontab不支持“季度末”语义,需用每月1日执行脚本判定上月最后一天是否为3/6/9/12月末,若是则触发高安全级归档。

Linux 的 crontab 本身不支持“季度末”这种语义级时间表达(如3月31日、6月30日、9月30日、12月31日),因为它只识别固定字段:分钟、小时、日期、月份、星期。而各季度最后一天的日期不统一(3月31日、6月30日、9月30日、12月31日),且闰年2月不参与,无法用单一 crontab 行精确覆盖。因此,“每逢特定季度末自动触发”需通过“每月检查 + 脚本判断是否为季末”来实现。
核心思路:用每月1日执行脚本,由脚本判定当天是否为季度末
crontab 只能按月、日触发,不能直接识别“本季度最后一天”。最可靠做法是:
- 设定任务每月1日零点运行(0 0 1 * *)
- 脚本中计算“上个月的最后一天”
- 判断该日期是否属于3月、6月、9月或12月的月末
- 若是,则执行高安全级历史归档(含物理离线存储动作)
具体配置步骤
1. 编写季末判定与归档脚本(例如 /opt/bin/quarterly-archive.sh)
内容示例(使用 GNU date,兼容主流发行版):
#!/bin/bash # 设置严格模式和日志 set -euo pipefail LOG="/var/log/quarterly-archive.log" exec >> "$LOG" 2>&1 echo "[$(date '+%Y-%m-%d %H:%M:%S')] Start check..." <h1>获取上个月最后一天(格式:YYYY-MM-DD)</h1><p>LAST_DAY_OF_PREV=$(date -d "$(date -d 'last month' +'%Y-%m-01') +1 month -1 day" +'%Y-%m-%d' 2>/dev/null || exit 1) YEAR=$(date -d "$LAST_DAY_OF_PREV" +'%Y') MONTH=$(date -d "$LAST_DAY_OF_PREV" +'%m')</p><h1>判定是否为季度末:3月、6月、9月、12月的最后一天</h1><p>case "$MONTH" in "03"|"06"|"09"|"12") echo "[$(date)] Detected quarter-end: $LAST_DAY_OF_PREV — triggering archive..."</p><pre class="brush:php;toolbar:false;"># ▶▶▶ 此处插入高安全级归档逻辑 ▶▶▶ # 示例(请按实际替换): # - 生成带校验码的加密归档包 # - 写入WORM(一次写多次读)磁带设备(如 /dev/st0) # - 执行物理离线操作(如 umount 并标记介质为 offline) # - 记录介质序列号、哈希值、时间戳至审计库 /opt/bin/do-high-security-archive.sh --date="$LAST_DAY_OF_PREV" --tape="/dev/st0" ;;
*) echo "[$(date)] Not quarter-end ($LAST_DAY_OF_PREV), skip." exit 0 ;; esac
2. 赋予执行权限并测试
chmod +x /opt/bin/quarterly-archive.sh- 手动运行一次:
/opt/bin/quarterly-archive.sh,确认日志输出与逻辑正确
添加到 crontab
执行 crontab -e,加入:
0 0 1 * * /opt/bin/quarterly-archive.sh
该行含义:每月1日0点0分执行判定脚本。
高安全级归档的关键实践(非 crontab 本身,但必须配套)
所谓“高安全级历史归档日志物理离带”,需在脚本中落实以下要点:
-
路径与命令必须用绝对路径:crontab 环境 PATH 极简,
date、tar、openssl、mt等均需写全路径(如/usr/bin/date) -
物理离线需显式控制磁带设备:使用
mt -f /dev/st0 offline或厂商工具执行卷卸载与物理隔离 - 完整性保障:归档前生成 SHA256 校验和,写入独立审计日志并同步至气隙系统
-
权限与审计:脚本应以专用低权限用户(如
archiver)运行;所有操作记录到/var/log/audit/并启用 logrotate -
失败熔断:任一环节失败(如磁带写保护、校验不匹配)立即中止,发送告警(可用
logger -p local0.err接 syslog)











