Как я могу сказать cron запускать команду каждый день (нечетный / четный)

При настройке cron для запуска команды каждый день с использованием поля «День месяца», например:

1 22 */2 * * COMMAND 

он запускается каждый раз, когда день месяца нечетный: 1,3,5,7,9 и так далее.

Как я могу настроить cron для работы в дни месяца, которые даже похожи на 2,6,8,10 и т. Д. (Без указания его буквально, что проблематично, поскольку каждый месяц имеет разное количество дней в месяце)?

4 Solutions collect form web for “Как я могу сказать cron запускать команду каждый день (нечетный / четный)”

Синтаксис, который вы пробовали, на самом деле неоднозначен. В зависимости от того, сколько дней в месяце, несколько месяцев он будет работать в нечетные дни, а некоторые – даже. Это связано с тем, что метод, который он вычисляет, принимает общее количество возможностей и делит их. Вы можете переопределить это поведение, указав диапазон дней и используя нечетное или четное количество дней. Поскольку даже дневные скрипты никогда не будут работать в течение 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 днями, ваша команда также будет работать в первом месяце. Точно так же, если вы заставляете четный цикл, каждый високосный год вызовет один трехдневный цикл и конец февраля. Вы не можете обойти тот факт, что любая регулярная картина «каждый день» не всегда будет падать на четные или нечетные дни в каждом месяце, и любым способом, которым вы это принуждаете, у вас будет либо дополнительный прогон, либо пропущен пробег между месяцев с пропущенными деньгами.

Давайте проверим каждый день, если это «другое» 🙂 (требуется программа bc )

 0 0 * * * test $(echo `date +%s` / 86400 % 2 == 0 |bc) -eq 0 && command 

(Я не уверен, что код отображается правильно. date +%s находится между обратными апострофами.)

Я думаю, что возможность использует день года, например:

 # for odd days test $(((`date +%j` % 2))) != 0 && command # for even days test $(((`date +%j` % 2))) == 0 && command 

Он протестирован для систем Unix и Linux.

В общем, я буду запускать его каждый день и использовать сценарий для определения его, если он должен быть запущен сегодня.

Создание простого файла состояния, когда он запускается, а затем компиляция будет работать очень легко.

Если его нужно запускать из разных источников, сделайте его зависимым от аргументов.

  • Где пользователи cronjob
  • Задача Cron, запланированная для запуска в определенный день недели, также работает в последний день месяца
  • crontab исключает только определенную дату
  • Cron не работает со сценарием оболочки
  • crontab -e не работает
  • Задача Cron запускаться каждую минуту с 11:00 до 6:00
  • Вход Crontab с часовым диапазоном, проходящим в полночь
  • Значение записи «* * / 1 * * *» cron?
  • Где работает этот cronjob?
  • Как root, как я могу перечислить crontab для всех пользователей?
  • Как этот кронаб интерпретирует «* / N * * * *», где N находится между 31 и 59?
  • Linux и Unix - лучшая ОС в мире.