Как написать 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
).
Для исключения даты я бы просто создал свой собственный скрипт. В этом скрипте проверьте дату, а затем решите, хотите ли вы выполнить следующую инструкцию(и).