cron表达式 每天0点10分和30分_查找特定时间段cron任务方法

bd9131593803dedc93f6ae30255ba44a.png

查找特定时间段cron任务方法

今天有个同学问:“如何查找特定时间段的cron调度任务?”, 这类问题通常是维护中经常遇到的,例如:

生产系统升级时,比如0点生产业务处理任务停止,到了5点0分恢复生产业务处理程序运行,那么在0点到5点前的调度任务就要人工运行了。

如果生产的cron调度任务有10个,一眼就能看完,如果有100个调度任务呢?这就要靠脚本来提取了。

先来说下cron配置规则:

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │                                   7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>

其中,每个字段格式:可以包含`逗号(,:表示离散点)`、`减号(-:表示时间段a-b)`。

知道配置规则后,接下来就开始是心啊查找cron调度任务区间 [s,e)的方法:

以下面几个调度为例:

0 0,10 * * * sh /path/to/job1.sh >/dev/null 2>&1
0 0-5 * * * sh /path/to/job2.sh >/dev/null 2>&1
0 1-2,5-10 * * * sh /path/to/job3.sh >/dev/null 2>&1
0 * * * * sh /path/to/job4.sh >/dev/null 2>&1
0 23 * * * sh /path/to/job5.sh >/dev/null 2>&1

如上几个调度示例,我们可以通过使用get_cron脚本正确的提取出:

$ get_cron 2
0 1-2,5-10 * * * sh /path/to/job3.sh >/dev/null 2>&1
0 * * * * sh /path/to/job4.sh >/dev/null 2>&1

$ get_cron 2-11
0 0,10 * * * sh /path/to/job1.sh >/dev/null 2>&1
0 0-5 * * * sh /path/to/job2.sh >/dev/null 2>&1
0 1-2,5-10 * * * sh /path/to/job3.sh >/dev/null 2>&1
0 * * * * sh /path/to/job4.sh >/dev/null 2>&1

get_cron脚本源代码如下:

#!/usr/bin/env bash
########################################################################
# File Name: get_cron
# Author: 悟空的学习笔记
# Website: https://www.learnhard.cn
# Created Time: 2021年01月16日 星期六 17时21分01秒
########################################################################

usage()
{
    cat <<END
usage:
    `basename $0` <start-hour> [end-hour]
    查找cron调度任务区间 [s,e)方法
END
}

if [ "$#" -lt "1" ] ; then
    usage
    exit 0
fi

s="$1"
e="$2"
if [ "$e" = "" ] ; then
    let e="$s+1"  # 取当前一小时内调度
fi

# 查找调度区间 [s,e)
crontab -l | awk -v s=$s -v e=$e '!/^#|^$/{
    hours_field = $2
    # 每小时都执行
    if( hours_field !~/^[0-9]|*/)
        next
    if (hours_field == "*") {
        print $0
        next
    }
    # 分离离散小时点
    n=split(hours_field ,hours_points , ",");
    for(i=1; i<=n;i++) {
        # 分离小时段
        m = split(hours_points[i] ,hours_line , "-");
        if(m <= 2) { # a-b or a
            a = hours_line[1]
            if( a >= s && a < e){
                ##   ---s---a---b1---e---b2-->
                print $0;
                next
            }
            else if( m == 2){
                b = hours_line[2]
                ##   --a--s----b---e--->
                if( b >= s && b < e) {
                    print $0
                    next
                }
            }
        }
    }
}'

了解更多Awk命令使用知识可以阅读Awk编程入门到精通,通过学习与实践,让你轻松掌握Awk编程方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值