检查 cronjob 的时间表并对特定部分进行条件检查

检查 cronjob 的时间表并对特定部分进行条件检查

编辑:我设法自己解决了这个问题,实际上我删除了原来的问题,因为我使过程稍微复杂化了,但后来回答了它,以防其他人发现它有用。在这种情况下不需要 RegExp,因为它主要处理基于数字的结果。

原问题:

我有一个write_cronjob()函数可以检查传递的作业是否已经存在,或者如果 grep 条件没有找到任何匹配的内容,则写入 crontab。

由于某些网络限制,cronjobs 只能安排在特定的窗口中。由于用户可以自由设置计划,因此脚本需要检测尝试在定义的窗口之外计划的任何作业,因为它们不会运行。

该函数有两个参数:

  • $1- 仅包含 cron 计划,例如0 19 * * 3
  • $2- 包含要运行的作业/命令

如果需要,它们会在写入操作之前合并。

Cron 调度规则必须符合以下标准:

  • 周一至周五(平日)
  • 上午 7 点 (07:00 AM) - 晚上 10 点 (22:00 PM)

我正在考虑对日部分进行范围检查,这很简单,但小时部分有点难,使用 24 小时时间,即 22 = 10 PM。

我的要求是:

  1. 能够拆分$1以挑选 cronjob 的小时和日期部分进行条件检查。
  2. RegExp 模式/范围检查分割部分以检测它们是否超出标准,并exit 1相应地进行检查。

笔记:

我的外壳是 ash (BusyBox),我无法使用数组。

答案1

我能够$1用 awk 分割并提取小时和日期部分。由于其默认分隔符是空格,因此可以很好地分割 cronjob 时间值。

的示例值$10 19 * * 1-5

CRONJOB_HOUR=$(echo "$1" | awk '{ print $2 }') # Second position: 19
CRONJOB_DAY=$(echo "$1" | awk '{ print $5 }') # Fifth position: 1-5

将这些部分放在变量中,我就可以进行条件检查。

第一个检查将是小于或大于检查以创建范围

if [ "${CRONJOB_HOUR}" -lt 7 ] || [ "${CRONJOB_HOUR}" -gt 22 ] ; then
    echo "Cronjob cannot be scheduled within specified hour"
    exit 1
fi

第二个条件是在匹配的基础上完成的,而不是等于,以捕获像 1-6 这样的值

if [[ "${CRONJOB_DAY}" == *"6"* ]] || 
[[ "${CRONJOB_DAY}" == *"7"* ]] 
then
    echo "Cronjob cannot be set to run at weekends"  
    exit 1
fi

相关内容