Существует ли выражение Cron для планирования задачи через каждые 5 месяцев через границы года? - PullRequest
0 голосов
/ 23 января 2019

У меня есть повестка дня, которую я хочу запланировать на каждые пять месяцев.Предположим, что я начал эту работу 20 января, поэтому теперь график должен быть 20 января 2019 года, 20 июня 2019 года, 20 ноября 2019 года, 20 апреля 2020 года и т. Д.

Повестка дня использует cron для планирования.

Проблема с 00 00 20 1,6,11 * заключается в том, что он никогда не будет работать в апреле, он будет запускаться
в 2019-06-01 00: 00: 00
, затем в 2019-11-01 00: 00: 00
, затем в 2020-01-01 00: 00: 00
, затем в 2020-06-01 00: 00: 00
, затем в 2020-11-01 00: 00: 00.

Другое выражение, которое я использовал, это 00 00 20 */5 *.Время следующего запуска:
в 2019-06-20 00: 00: 00
, затем в 2019-11-20 00: 00: 00
, затем в 2020-01-20 00: 00: 00
, затем в 2020-06-20 00: 00: 00
, затем в 2020-11-20 00: 00: 00

, но это не тот месяц, когда я хочу, чтобы он работал, т.е.с регулярным интервалом в пять месяцев.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Cron не может сделать это напрямую, но вы можете переместить эту логику в скрипт, который вы вызываете каждый месяц.Ваша задача cron может выглядеть так:

0 0 20 * * monthcheck 2019 1 5

и monthcheck - это сценарий где-то на вашем пути с таким содержимым:

#!/usr/bin/env bash

baseyear=$1
basemonth=$2
interval=$3

read -r year month <<< "$(date '+%Y %-m')"

if (( (12*(year-baseyear) + (month-basemonth)) % interval == 0 )); then
    echo "Run the script"
fi

Для этого требуется базовая дата, указанная в году и месяце (baseyear и basemonth, поставляются в качестве аргументов с 2019 и 1 в записи crontab) плюс интервал в месяцах (interval, значение 5 в примере).

Этозатем считывает текущий год и месяц в year и month, проверяет, сколько месяцев прошло с момента основания, и если эта разница кратна interval (деление по модулю на интервал 0), выполняетсяваш скрипт (в этом примере просто команда echo).

Строка форматирования для date использует %-m, чтобы избежать заполнения нулями в течение месяца (вместо 01 получается 1).Эта функция может присутствовать не во всех date - здесь я использую GNU date.

0 голосов
/ 23 января 2019

Я не смог найти способ начать с точной даты в месяце, когда он начался.Если все в порядке, это первое (как пример ниже), вы можете использовать это:

Contab guru

«В 00:00 в день месяца 1через каждые 5 месяцев ».

В противном случае поиграйте со значениями, которые соответствуют вашим потребностям.

...