Cronjob запускается каждые две недели, в субботу, начиная с этой субботы

11

Сегодня пятница, 3 октября 2014 г. 3:58

Я хочу запланировать такой cronjob, чтобы он запускался на следующие даты:

  1. Суббота, 4 октября 2014 г., 8:00
  2. Суббота, 18 октября 2014 г., 8:00
  3. Суббота, 1 ноября 2014 г. 8:00 утра ... ...

Так что каждые 2 недели, в субботу, в 8 часов.

купа
источник

Ответы:

27
0 8 * * 6 test $((10#$(date +\%W)\%2)) -eq 1 && yourCommand

date +%W: номер недели в году с понедельником в качестве первого дня недели, сегодня неделя 39

10#$(date +%W): преобразовать в date +Wдесятичное число и избежать путаницы при разборе базы

$((39%2)): операция по модулю: результат равен 0 (четный номер недели) или 1 (нечетный номер недели), результат этой недели равен 1, следующая неделя 0

test 1 -eq 1: арифметический тест (равный), в этом случае результат является логическим значением true

&& yourCommand: Boolean AND: запускать yourCommandтолько в том случае, если результат предыдущей команды был логическим значением true

Обратите внимание, что год может получить две нечетные недели: 53 (в этом году) и 1 (в следующем году)

Кир
источник
2
Это элегантно! У него все еще, как вы отметили, есть угловой случай в 53-ю субботу года, которая случится примерно через семьдесят лет через каждые четыре столетия.
MadHatter
@Cyrus спасибо за ваш ответ, но если я напишу * * * * 5 test $ (($ (date +% W)% 2)) -eq 1 && /u02/restore/scripts/test.sh, сценарий не запустить, но если я напишу * * * * 5 /u02/restore/scripts/test.sh скрипт запускается. почему ваше выражение не работает? Я просто проверял дела. И обнаружил, что не работает как-то.
Купа
1
Виноват. Крон интерпретирует% как перевод строки. Побегите оба% с помощью \ в вашем cronjob:0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
Cyrus
К сожалению , чтобы вернуть этот старый вопрос , но он не работает для меня , и когда я пытаюсь выполнить $((10#$(date +%W)%2)) -eq 1 && echo OKмои оболочки пытаются выполнить результат вычисления недели: -bash: 1: command not found. Любая подсказка, почему он это делает? Спасибо.
jhuet
3
@jhuet: testэто не пользователь, это команда. Попробуйте:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Cyrus
4

То, что вы показали, это «каждую неделю». Тогда код:

0 8 * * 6

Вы уверены, что вам нужно запускать его каждые две недели?

0 8 * * 6 expr `date +\%s` / 604800 \% 2 >/dev/null || yourCommand
Glueon
источник
1
Можете ли вы объяснить команду, пожалуйста
Купа
1
Лучше использовать то, что дал Сайрус - $ (($ (дата +% W)% 2)) "W" обозначает номер недели в году. Начиная с нуля до 53. Если это можно разделить на два, то это ваша "каждая вторая" неделя. Таким образом, cronjob запускается каждую неделю, но «expr» выполняет команду yourCommand, только если номер недели можно разделить на 2.
Glueon
когда я запускаю test $ (($ (date +% W)% 2)) -eq 1 в командной строке, ничего не возвращается, почему?
Купа
1
просто запустите echo $?после запуска этой команды, чтобы увидеть ее код возврата - вот что важно с ней
Ale