Как запланировать раз в две недели cronjob?

10

crontab (5) определяет следующие поля:

       field         allowed values
       -----         --------------
       minute        0-59
       hour          0-23
       day of month  1-31
       month         1-12 (or names, see below)
       day of week   0-7 (0 or 7 is Sun, or use names)

и объясняет:

 Step values can be used in conjunction with ranges.  Following a range
 with ``/<number>'' specifies skips of the number's value through the
 range.  For example, ``0-23/2'' can be used in the hours field to specify
 command execution every other hour (the alternative in the V7 standard is
 ``0,2,4,6,8,10,12,14,16,18,20,22'').

Так что, насколько я понимаю, не раз в две недели Джобс. Я совершенно уверен, что есть обходные пути, какие у вас? Или я что-то пропустил?

Роман
источник
2
Лучший ответ на этот вопрос я могу найти здесь: unix.stackexchange.com/questions/1224/…
Сомантра
... и эти ответы на U & L будут такими же, как я, @Somantra :-)
voretaq7
@ voretaq7, я бы сказал, что это был канонический ответ, но я не хотел
показаться

Ответы:

8

Каждую среду вы можете запускать эту вещь с помощью cron, а затем запустить ее и решить, будет ли она четной или нечетной. например:

#!/bin/bash
week=$(date +%U)
if [ $(($week % 2)) == 0 ]; then 
    echo even week
else 
    echo odd week
fi
тушеное мясо
источник
Это хорошее решение, однако, на самом деле не отвечает сам вопрос - я бы предпочел не портить это с логикой графика. Возможно я могу объединить это со ссылкой, которую дал @Somantra.
Роман
Хорошо, я должен признать: это лучшее решение на данный момент. Ссылка, которую дала @Somantra, дает те же результаты, что и излишне сложное IMHO (считая со временем UNIX), но добавление вашего подхода непосредственно к cronjob (а не в сценарий) в том же стиле делает его довольно элегантным.
Роман
Это перерыв в 2020 году, потому что у него есть 53 недели. Пример: если ваш cron должен запускаться раз в две недели 31 декабря, он будет работать 31 декабря 2020 года (53-я неделя) и 4 января 2020 года (1-я неделя).
mad_fox
4

Многие кроны (вы не указали, что вы используете) поддерживают диапазоны. Так что-то вроде

0 0 1-7,15-21 * 3

Появится первая и третья среда месяца.

quadruplebucky
источник
это немного более элегантно, чем метод «сделай это в скрипте», но не забудьте добавить комментарий в свой crontab (общее правило: если у вас их больше -или /есть, вероятно, стоит прокомментировать, чтобы описать расписание)
voretaq7
Я подозреваю, что это неправильно; Это приведет к выполнению задания 1-7 и 15-21 числа каждого месяца, а также каждую среду. Это из man 5 crontab: « День выполнения команды может быть задан двумя полями - днем ​​месяца и днем ​​недели. Если оба поля ограничены (т. Е. Не *), команда будет запущена, когда любое из полей соответствует текущее время. Например, «30 4 1,15 * 5» приведет к выполнению команды в 4:30 утра 1-го и 15-го числа каждого месяца плюс каждую пятницу »(мой акцент).
MadHatter
1
На самом деле, это зависит от того, какой демон cron вы используете. Похоже, ваша запись от vixie cron (входит в дистрибутив RedHat). От "man crontab" на cron dillo (Slackware): если вы укажете и день в месяце, и день недели, * он будет интерпретироваться как N-й такой день в месяце *. Тем не менее, скриптовое решение (вычисление номера недели) выглядит как единственное переносимое решение.
AlvaroGMJ
2

Для чего-то, что должно запускаться каждую вторую неделю, используйте эту строку:

0 0 * * 5 [ `expr \`date +\%V\` \% 2` -eq 0 ] && echo "execute script" 

Этот конкретный сценарий планируется запустить по пятницам. Неделя для выполнения может быть скорректирована с помощью «-eq 0» или «-eq 1»

Алексий
источник
1

Анакрон - хороший способ обойти ограничения cron.

  • Anacron имеет параметр Период повторения, который можно установить на 14.

команда идентификатора задания задержки

14 15 test.daily /path/to/script.sh

Somantra
источник
К сожалению, анакрон не может быть использован. Забыл упомянуть об этом.
Роман
1

Если ваши потребности не являются буквально раз в две недели, вы можете просто запустить cronjob 1-го и 15-го числа месяца:

15 8 1,15 * * /your/script.sh

Который работает в 8:15 утра первого и пятнадцатого числа каждого месяца независимо от дня недели.

Крис Брюер
источник
-2

Исходя из этого объяснения, установка 3/2 в поле недели должна запускать задачу в каждую другую среду - это неявно, но я думаю выполнимо.

Подмастерье
источник
нет, это равносильно тому, что for(int i=3; i <=3 ; i+=2) {} он проходит через это только один раз, не имеет значения, является ли «шаг» 1 или 2.
тушить
Что сказал @ тушеное мясо Также нет «недельного поля».
Роман
Под полем недели я подразумеваю «поле дня недели»
Путешественник Geek