Как предложил Уильям, cron не может справиться с этой сложностью сам по себе. Тем не менее, вы можете запускать работу cron чаще и использовать что-то еще для логики. Например;
30 7 16-31 1 * date '+\%j' | grep -q '0$' && yourcommand
30 7 * 2-12 * date '+\%j' | grep -q '0$' && yourcommand
Эта строка формата даты печатает день года, от 001 до 365. grep -q
будет делать по шаблону, не печатает результаты, но возвращает успех отказа на основании того, что он находит , Каждые 10 дней день года заканчивается на ноль. В те дни yourcommand
запускается.
У этого есть проблема с переходом года. Более сложной альтернативой может быть сделать аналогичный grep на продукте date '+%s'
(эпоха второй), но вам нужно будет сделать математику, чтобы превратить секунды в дни для анализа на grep
. Это может работать (вы должны проверить):
SHELL=/bin/bash
30 7 * * * echo $(($(date '+%s')/86400)) | grep '0$' && yourcommand
(Добавить Jan 16 логика, конечно, тоже.)
Это зависит от того, что обстреливать арифметика может обрабатывать только целые числа. Оболочка просто усекает, а не округляет.
UPDATE
В комментарии на другой ответ, вы уточнить ваши требования:
Команда должна начать выполнение 16-го января, и по-прежнему, как 26 января, 5 февраля , 15 февраля и т. Д. - jai
Для этого эпох-второй подход вероятно, в правильном направлении.
% date -v1m -v16d -v7H -v30M -v0S '+%s'
1452947400
(я в FreeBSD, следовательно, эти аргументы date
.)
SHELL=/bin/bash
30 7 * * * [[ $((($(date '+\%s') - 1452947400) \% 864000)) == 0 ]] && yourcommand
Это выражение вычитает эпоху секунду 7.30 16 января (мой часовой пояс) от текущего времени, и проверяет, является ли полученная разность делится на 10 дней. Если это так, выражение оценивает значение true, и ваша команда запускается. Обратите внимание, что $((0 % $x))
оценивает 0 при любом значении $ x.
Это может быть связано с ошибкой, если cron особенно занят и не может добраться до вашей работы за одну секунду, когда математика работает.
Если вы хотите сделать это более сложным (и, возможно, даже если это этот комплекс), я рекомендую вам переместить логику в отдельный сценарий оболочки для обработки математики сравнения дат. Особенно, если вы планируете добавить фактор выдумки, чтобы задания могли пропустить их 1-секундное окно .. это, вероятно, будет несколько строк сценария, что неудобно поддерживать в одной записи cronjob.
cron действительно не оборудован для обработки этой логики. Вам лучше запускать скрипт-оболочку каждый день, который проверяет дату и отменяет или продолжает по мере необходимости. –
@WilliamPursell Искал много и понял, что не может .. Я написал кое-что, что хватит для диапазона дат начиная с 6 января 2016 года по 31 декабря 2016 года. Я написал 7 команд cron. 30 7 6,16,26 1,3 * команда>/DEV/нуль 30 7 5,15,25 2,4,5 * команда>/DEV/нуль 30 7 4,14,24 6 , 7 * команда>/DEV/нуль 30 7 3,13,23 8 * команда>/DEV/нуль 30 7 2,12,22 9,10 * команда>/DEV/нуль 30 7 1 , 11,21 11,12 * команда>/dev/null 30 7 31 12 * команда>/dev/null 2016 также високосный год. Я знаю, что это смешно, но я новичок и нуждаюсь в написании сценария. Я изменю его в следующем году. – jai
Вы хотите, чтобы он запускался 16 января следующего года или каждые 10 дней на неопределенный срок? –