Linux shell 指定日期区间循环调度

本文介绍如何使用Azkaban脚本分别处理不同日期格式的调度数据,包括从yyyy-MM-dd到yyyyMMdd的转换,并抓取指定时间段内的所有分区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景:Azkaban 调度历史数据 

1:调度 start_time ~ end_time 时间间隔内的所有分区 格式为 yyyy-MM-dd

#!/usr/bin/env bash
EXPORT_START_DATE=2021-05-01
EXPORT_END_DATE=2021-08-21


i=$EXPORT_START_DATE
while [[ $i < `date -d "+1 day $EXPORT_END_DATE" +%Y-%m-%d` ]]
do
STARTDATE=$i

   echo STARTDATE
i=`date -d "+1 day $i" +%Y-%m-%d`
done

2: 调度start_time ~ end_time 时间间隔内的所有分区 ,分区格式为 yyyyMMdd

#!/usr/bin/env bash
EXPORT_START_DATE=2021-05-01
EXPORT_END_DATE=2021-08-21


i=$EXPORT_START_DATE
while [[ $i < `date -d "+1 day $EXPORT_END_DATE" +%Y%m%d` ]]
do
STARTDATE=$i

   echo STARTDATE
i=`date -d "+1 day $i" +%Y%m%d`
done

### 对 Linux 中 Cron 表达式 `* */2 * * *` 的解析 #### 解析 Cron 表达式的各字段含义 Cron 表达式的格式由六个主要字段组成,分别是秒、分、小时、日期、月份和星期。以下是针对表达式 `* */2 * * *` 的逐字段解析[^2]: | 字段位置 | 含义 | 当前值 | 描述 | |----------|------------|----------|----------------------------------------------------------------------------------------| | 1 | 秒 | `*` | 每秒钟都会触发一次检查操作。 | | 2 | 分钟 | `*` | 每分钟都满足条件,表示每分钟都会执行任务。 | | 3 | 小时 | `/2` | 从第 0 小时开始,每隔 2 小时触发一次任务。 | | 4 | 日历日期 | `*` | 每一天都会触发任务。 | | 5 | 月份 | `*` | 每个月都会触发任务。 | | 6 | 星期 | `*` | 不排除任何特定的星期几,表示每天都符合条件。 | 此表达式的关键在于 **分钟字段为 `*`** 和 **小时字段为 `/2`**。这意味着任务会在每一小时中的每一个分钟被执行,但是整体的任务周期是以两个小时为单位重复。 --- #### 执行频率的具体说明 虽然该 Cron 表达式看起来像是“每分钟执行一次”,但实际上它的真实行为是: - 在偶数小时(如 0:00 至 1:59、2:00 至 3:59 等)内的每一分钟执行一次任务。 - 在奇数小时(如 1:00 至 1:59、3:00 至 3:59 等)期间完全不执行任务。 换句话说,这个表达式并不是简单地“每分钟执行一次”,而是限定在每两个小时内才会有这样的行为模式。 --- #### 高频误解的原因分析 如果有人认为此表达式会导致“每分钟执行一次”的效果,可能是由于以下原因造成的混淆: 1. **忽略小时字段的作用** - 用户可能只关注了分钟字段的内容 (`*`),而忽略了小时字段的限制作用 (/2)[^3]。 2. **测试环境的影响** - 如果测试环境中恰好处于某个偶数小时区间,则容易误以为任务一直在持续运行而不间断。 3. **日志记录误导** - 类似于之前提到的情况,高频的日志更新也可能让人觉得任务频繁启动,即使实际并非如此。 为了更清楚地区分这些概念,建议仔细阅读完整的 Cron 表达式定义,并结合具体应用场景来设计合适的调度计划。 --- ### 示例代码验证 下面给出一个简单的 Shell 脚本来模拟上述 Cron 表达式的行为: ```bash #!/bin/bash while true; do current_hour=$(date +"%H") if ((current_hour % 2 == 0)); then echo "Executing task at $(date)" fi sleep 60 done ``` 在这个脚本里,我们通过判断当前小时是否能被 2 整除来决定是否应该输出消息。“sleep 60”语句确保每次循环之间等待一分钟再继续下一轮检测过程。 --- ### 总结 综上所述,对于给定的 Cron 表达式 `* */2 * * *` ,它的实际表现形式应理解成:“每当进入一个新的偶数小时之后,在接下来的一个小时内,每分钟都将单独触发一次相应的处理动作。” 这种安排既体现了灵活性又兼顾了一定程度上的效率考量。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值