#!/bin/bash # Specify text file with cron-style schedule, and commands # Like the following example # * * * * * /path/to/some/command # */15 * * * * /path/to/another/command # * 2,15 * * * /path/to/yet/another/command # Or pass text via STDIN CRONFILE="$1" # Use GNU `date` binary instead of default macOS one DATE="/usr/local/Cellar/coreutils/8.26/bin/gdate" # Path to Python; make sure the module # `croniter` is installed using `pip install croniter` PYTHON="/usr/local/bin/python" BEGINDATE="2017-01-13 23:00:00" ENDDATE="2017-01-14 03:00:00" BEGINYEAR=$(${DATE} --date="${BEGINDATE}" +%Y) BEGINMONTH=$(${DATE} --date="${BEGINDATE}" +%m) BEGINDAY=$(${DATE} --date="${BEGINDATE}" +%d) BEGINHOUR=$(${DATE} --date="${BEGINDATE}" +%H) BEGINMINUTE=$(${DATE} --date="${BEGINDATE}" +%M) BEGINUNIX=$(${DATE} --date="${BEGINDATE}" +%s) ENDYEAR=$(${DATE} --date="${ENDDATE}" +%Y) ENDMONTH=$(${DATE} --date="${ENDDATE}" +%m) ENDDAY=$(${DATE} --date="${ENDDATE}" +%d) ENDHOUR=$(${DATE} --date="${ENDDATE}" +%H) ENDMINUTE=$(${DATE} --date="${ENDDATE}" +%M) ENDUNIX=$(${DATE} --date="${ENDDATE}" +%s) OUTPUTFILE="crons-${BEGINHOUR}-${ENDHOUR}.txt" while read line; do cronminute=$(echo "${line}" | awk '{print $1}') cronhour=$(echo "${line}" | awk '{print $2}') cronday=$(echo "${line}" | awk '{print $3}') cronmonth=$(echo "${line}" | awk '{print $4}') crondow=$(echo "${line}" | awk '{print $5}') NEXTRUN=$(${PYTHON} -c "from croniter import croniter;from datetime import datetime;base = datetime(${BEGINYEAR}, ${BEGINMONTH}, ${BEGINDAY}, ${BEGINHOUR}, ${BEGINMINUTE});iter = croniter('${cronminute} ${cronhour} ${cronday} ${cronmonth} ${crondow}', base);print iter.get_next(datetime)") NEXTRUNUNIX=$(${DATE} --date="${NEXTRUN}" +%s) if [[ ${NEXTRUNUNIX} -ge ${BEGINUNIX} && ${NEXTRUNUNIX} -le ${ENDUNIX} ]]; then echo "${line}" >> "${OUTPUTFILE}" fi # done < <(cat ${CRONFILE}) done < "${CRONFILE:-/dev/stdin}"