crontab исключает только определенную дату

crontab исключает только определенную дату

Как написать cron, который исключит определенную дату?

скажем: мне нужно запускать crontab с 18:00 до 21:00 каждые 30 минут по выходным и хочу исключить только 10 мая 2014 года.

Возможно ли это? Как мне это написать? Или есть ли какая-то альтернатива этому? Пожалуйста, предложите.

решение1

Стандартный синтаксис cron довольно прост, он не поддерживает исключения. В некоторых случаях можно создать список из нескольких/многих записей cron для реализации такой логики, но это, как правило, утомительно и сложно для понимания или поддержки; этот подход неприменим в вашем случае (не в последнюю очередь потому, что стандартный cron не имеет понятия о календарном годе).

Не стоит усложнять команды cron, но это можно сделать с помощью чего-то относительно простого, например:

0,30 18-20 * * sat,sun [ "$(date +\%Y\%m\%d)" = "20140510" ] || mycommand
0    21    * * sat,sun [ "$(date +\%Y\%m\%d)" = "20140510" ] || mycommand

(С " 0,30 18-21" задача также будет запущена в 21:30; вам нужна вторая строка, если вы хотите запустить ее также в 21:00, если нет, то пропустите ее)

ПРИМЕЧАНИЕ: Внекоторые кронтабынеобходимо экранировать знаки процента (они используются для обозначения новой строки при добавлении встроенных данных в стандартный ввод команды), хотя в cron Диллона этого не происходит.

Команда cron на самом деле является оболочкойсписок команд, ||оператор управления обеспечиваетоценка короткого замыканиякоманд. Команды в списке выполняются по одной, слева направо, но выполнение останавливается, когда первая возвращает true. Если сравнение строк даты возвращает true (только для одного дня) mycommandне выполняется, когда сравнение дат возвращает false, mycommandвыполняется.

Обратите внимание, однако, что многое может отличаться в способе запуска программ cron. Наиболее надежный подход — использовать скрипт-обертку для реализации условной логики.

решение2

Вы можете использовать X-Yдля временных интервалов и */Zдля частот. Где:

  • Xначало интервала.
  • Yконец интервала.
  • Zэто просто делитель (т.е.: каждый Z).

Для исключения даты я бы просто создал свой собственный скрипт. В этом скрипте проверьте дату, а затем решите, хотите ли вы выполнить следующую инструкцию(и).

Связанный контент