在特定时间之间每3分钟进行一次Cron表达

问题描述

这是场景:- 我想在NodeJs应用程序中运行特定功能,为此我正在使用NodeScheduler

我知道我可以使用这个表达式

* / 3 8-15 * * *

在上午8点至下午3点之间每3分钟运行一次,但我想在上午8:30至下午3:15之间运行它,但是我为此做出的Cron表达式肯定是错误

30-15 / 3 8-15 * * *

有人知道这种情况下正确的cron表达式吗?

解决方法

普通的cron不能给你那么高的表现力,但是没有什么可以阻止您在条目的命令部分中施加更多的限制:

*/3 8-15 * * * [[ 1$(date +\%H\%M) -ge 10830 ]] && [[ 1$(date +\%H\%M) -le 11515 ]] && payload

这实际上将在上午8点至下午4点之间每三分钟运行一次cron作业,但是仅当当前时间在上午8:30至3点之间时才调用有效负载(您的脚本执行实际工作) :下午15点。

1放在时间前面只是一个技巧,可以避免将以零开头的数字视为八进制的问题。


实际上,我有一个脚本withinTime.sh,证明对这种事情很有用:

usage() {
    [[ -n "$1" ]] && echo "$1"
    echo "Usage: withinTime <hhmmStart> <hhmmEnd>"
}

validTime() {
    [[ "$1" =~ ^[0-9]{4}$ ]] || return 1  # Ensure 0000-9999.
    [[ $1 -le 2359 ]] || return 1         # Ensure 0000-2359.
    return 0
}

# Parameter checking.

[[ $# -ne 2 ]] && { usage "ERROR: Not enough parameters"; exit 1; }
validTime "$1" || { usage "ERROR: invalid hhmmStart '$1'"; exit 1; }
validTime "$2" || { usage "ERROR: invalid hhmmEnd '$2'"; exit 1; }

now="1$(date +%H%M)"
[[ ${now} -lt 1${1} ]] && exit 1  # If before start.
[[ ${now} -gt 1${2} ]] && exit 1  # If after end.

# Within range,flag okay.
exit 0

使用此脚本作为路径,您可以稍微简化cron命令:

*/3 8-15 * * * /home/pax/bin/withinTime.sh 0830 1515 && payload