Синтаксис, который вы пробовали, на самом деле неоднозначен. В зависимости от того, сколько дней в месяце, некоторые месяцы будут работать в нечетные дни, а некоторые - в четные. Это потому, что способ расчета рассчитывает общее количество возможностей и разделяет их. Вы можете переопределить это поведение strage-ish, вручную указав диапазон дней и используя нечетное или четное количество дней. Поскольку четные дневные сценарии никогда не будут выполняться в 31-й день более длинных месяцев, вы ничего не потеряете, используя 30 дней в качестве основы для четных дней, и, указав специально для деления, как если бы было 31 день, вы можете вызвать нечетные исполнение.
Синтаксис будет выглядеть так:
# Will only run on odd days:
0 0 1-31/2 * * command
# Will only run on even days:
0 0 2-30/2 * * command
Ваше беспокойство по поводу того, что месяцы не имеют одинакового количества дней, здесь не имеет значения, потому что ни в одном месяце не будет БОЛЬШЕ дней, чем этот, а для плохого февраля диапазон дат просто не будет совпадать с последним днем или двумя, но это не принесет вреда, если это в списке.
Единственный «уловка» для этого подхода состоит в том, что если вы находитесь в нечетном цикле дня, в следующие месяцы с 31 днем ваша команда также будет выполняться в первом месяце. Точно так же, если вы выполняете четный цикл, каждый високосный год будет вызывать один трехдневный цикл и конец февраля. Вы не можете обойти тот факт, что любой регулярный паттерн «каждый второй день» не всегда будет приходиться на четные или нечетные дни в каждом месяце, и как бы вы ни принудили это сделать, у вас либо будет дополнительный прогон, либо вы пропустите пробежку между месяцы с несоответствующим количеством дней.
0,2,4...,30,32,34
и это не будет иметь значения, значения вне диапазона просто никогда не будут совпадать.0 0 2-30/2 * * command
0 0 2-30/2 * * command
работает как положено.Я думаю, что есть возможность использовать день года, например, так:
Он протестирован для систем Unix и Linux.
источник
test $(($(date +%j) % 2)) == 0 && command
test $(($(date +%s) / 86400 % 2)) == 0 && command
Давайте каждый день проверять, является ли это «другим» :-) (
bc
требуется программа)(Я не уверен, что код отображается правильно.
date +%s
Часть находится между обратными апострофами.)источник
В общем, я бы запускал его каждый день, и чтобы скрипт использовал логику, чтобы определить, нужно ли его запускать сегодня.
Создание простого файла состояния, сообщающего о последнем запуске и последующем сравнении, будет работать очень легко.
Если его необходимо запустить из разных источников, сделайте его зависимым от аргумента.
источник