
查找特定时间段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编程方法。