Запустите скрипт через крон раз в две недели

ESMTP является релейным только сервером передачи почты, который может работать на Ваше приложение.

12
25.08.2010, 02:06
5 ответов
0 0 * * Thu bash -c '(($(date +\%s) / 86400 \% 14))' && your-script

Я использовал удар, чтобы сделать мою математику, потому что я ленив; переключатель, что к тому, что Вы любите. Я использую в своих интересах 1 января 1970, будучи четвергом; в течение других дней недели необходимо было бы применить смещение. Крону нужны знаки процента, которых оставляют.

Быстрая проверка:

function check {
  when=$(date --date="$1 $(($RANDOM % 24)):$(($RANDOM % 60))" --utc)
  echo -n "$when: "
  (($(date +%s --date="$when") / 86400 % 14)) && echo run || echo skip
}

for start in "2010-12-02" "2011-12-01"; do
  for x in $(seq 0 12); do
    check "$start + $(($x * 7)) days"
  done
  echo
done

Обратите внимание, что я выбрал случайные времена, чтобы показать, что это будет работать, если выполнено в любое время в четверг, и выбранные даты, которые пересекают границы года плюс, включают месяцы с и 4 и 5 четвергами.

Вывод:

Thu Dec  2 06:19:00 UTC 2010: run
Thu Dec  9 23:04:00 UTC 2010: skip
Thu Dec 16 05:37:00 UTC 2010: run
Thu Dec 23 12:49:00 UTC 2010: skip
Thu Dec 30 03:59:00 UTC 2010: run
Thu Jan  6 11:29:00 UTC 2011: skip
Thu Jan 13 13:23:00 UTC 2011: run
Thu Jan 20 20:33:00 UTC 2011: skip
Thu Jan 27 16:48:00 UTC 2011: run
Thu Feb  3 17:43:00 UTC 2011: skip
Thu Feb 10 05:49:00 UTC 2011: run
Thu Feb 17 08:46:00 UTC 2011: skip
Thu Feb 24 06:50:00 UTC 2011: run

Thu Dec  1 21:40:00 UTC 2011: run
Thu Dec  8 23:24:00 UTC 2011: skip
Thu Dec 15 22:27:00 UTC 2011: run
Thu Dec 22 02:47:00 UTC 2011: skip
Thu Dec 29 12:44:00 UTC 2011: run
Thu Jan  5 17:59:00 UTC 2012: skip
Thu Jan 12 18:31:00 UTC 2012: run
Thu Jan 19 04:51:00 UTC 2012: skip
Thu Jan 26 08:02:00 UTC 2012: run
Thu Feb  2 17:37:00 UTC 2012: skip
Thu Feb  9 14:08:00 UTC 2012: run
Thu Feb 16 18:50:00 UTC 2012: skip
Thu Feb 23 15:52:00 UTC 2012: run
11
27.01.2020, 19:55
  • 1
    с эпохи находятся по сути в UTC, в то время как крон работает в localtime. Если Вашим системным часовым поясом не будет UTC, то это приведет к беспорядку. ("Почему это не работает? О, уже в пятницу в UTC"). Существование летнего времени делает работу вокруг этого намного более трудной (хотя не невозможный, начиная с даты cal говорят Вам текущее смещение UTC), –  derobert 26.06.2012, 00:04

Один путь мог бы состоять в том, чтобы использовать at утилита, если Вы запускаете Linux. Вы могли поместить это в конце своего сценария:

at X + 2 weeks -f myscript

где X время, Вы хотите запустить свой скрипт в. Инициализировать просто вызов at в течение времени Вы хотите выполнить его в первый раз, когда и затем вышеупомянутый оператор продолжает повторно выступать с Вашим запланированным призывом.

5
27.01.2020, 19:55
  • 1
    Если бы это будет долгосрочным решением, я не рекомендовал бы выполнить это, хотя в я создал бы функцию в сценарии, который удастся, должен ли он выполнить –  Paul 14.01.2011, 17:01

Я не уверен, существует ли более изящный способ определить раз в две недели, но это может работать на Вас.

00 06 1-7,15-21 * * test `date +\%a` = Thu && /path/to/script

Это запустит сценарий в 6:00 в первые и третьи четверги месяца.

0
27.01.2020, 19:55
  • 1
    Это завершило бы пропуск недели, если существует месяц с 3 четвергами, все же. –  David Z 25.08.2010, 05:34
  • 2
    Существует ли месяц, который имеет только 3 четверга? Хотя я вижу, что он пропускает неделю, если существует 5 четвергов. Это может быть обновлено к 1-7,15-21,29-31, но затем это работало бы спина к спине, если бы были какие-либо соответствия для последнего набора... –  pferate 25.08.2010, 23:01
  • 3
    К 3 четвергам Вы имели в виду 3 четверга, которые сценарий выполнит а не 3 общих четверга? Я, возможно, неправильно читал его в первый раз. –  pferate 25.08.2010, 23:02

Если можно использовать anacron в системе вещи будут намного более простыми. Использовать anacron необходимо было установить его, и также у Вас должен быть корневой доступ. Это не работает над более старыми системами (т.е. RHEL 5.x), более старые версии ancron, на котором ТОЛЬКО работают, загружаются. Это действительно работает с более новыми системами (т.е. RHEL 6.x).

С anacron, можно запланировать задания более гибким способом, например, выполнить X заданий один раз в неделю. Также anacron задания выполнений, когда компьютер становится доступным, т.е. Вы не должны рассматривать, когда система произошла или вниз.

Для запущения скрипта раз в две недели необходимо добавить строку, подобную следующему к/etc/anacrontab:

14 5 myScript script.sh

Смотрите на страницу справочника для деталей.

3
27.01.2020, 19:55
  • 1
    Используя anacron ясно самое чистое решение IMO (если это не имеет некоторые нежелательные последствия для некоторых людей). –  JanC 28.08.2010, 17:07

Я выполнял бы его каждую неделю и имел бы проверку сценария, чтобы видеть, является ли недельное число нечетным числом: если да выход.

Этому была бы нужна еще некоторая мысль для работы с декабря по январь.

Возможно, имейте сценарий, устанавливает "последнее успешное выполнение" файл флага. Когда сценарий запускается, проверьте, что файл флага был в последний раз изменен 14 дней назад.

0
27.01.2020, 19:55

Теги

Похожие вопросы