Запускайте сценарій через cron через день


12

Я провів зовсім небагато досліджень, як це зробити, і я бачу, що немає жодного прямого способу в Cron виконувати роботу, скажімо, кожного другого четверга.

Прямо зараз, я схиляюся до робити скрипт , який буде просто працювати кожну тиждень, і стосуватиметься файл «прапор» , коли він працює, і якщо вона працює , і файл вже є, видалити файл (а не виконувати двотижнева акція).

Моє запитання: чи є ще якийсь більш елегантний чи простіший спосіб досягти цієї мети забитого сценарію дій, які виконуються через тиждень автоматично?

Дякую!


1
Замість файлу прапора ви можете використовувати номери тижнів ISO. (Наприклад,% V стрімкінгу)

@Roger: Я припускаю, що ви маєте на увазі умовно в сценарії.
Призупинено до подальшого повідомлення.

@Dennis: Це не повинно бути (наприклад, дивіться, як моя відповідь перевіряється поза сценарієм), але головна моя суть полягає в тому, що це було б набагато простіше і не вимагає стану у файловій системі. Однак я зрозумів, що у нього є аналогічний недолік, як і перевірка дня місяця: у деяких років 53 тижні, а в деяких 52.

Відповіді:


11
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

2
Секунди з моменту епохи притаманні UTC, тоді як крон працює за місцевим часом. Якщо часовий пояс вашої системи не буде UTC, це призведе до плутанини. ("Чому він не працює? О, його вже п'ятниця в UTC"). Існування літнього часу ускладнює роботу над цим набагато складніше (хоча і не неможливо, оскільки дату повідомляють про поточне зміщення UTC)
derobert

5

Одним із способів може бути використання atутиліти, якщо ви працюєте з Linux. Ви можете поставити це в кінці сценарію:

at X + 2 weeks -f myscript

де X - час, коли ви хочете запустити свій сценарій. Для ініціалізації просто зателефонуйте atна час, коли ви хочете його запустити вперше, а потім вищезазначене твердження продовжує поновлювати запланований дзвінок.


Якщо це буде довгостроковим рішенням, я б не рекомендував запускати цю функцію, хоча в сценарії я створив би функцію в сценарії, яка б розібралася, чи потрібно її запускати
Пол

3

Якщо ви можете використовувати anacronв системі, все буде набагато простіше. Щоб використовувати його, anacronви повинні встановити його, а також мати кореневий доступ. Він не працює в старих системах (наприклад, RHEL 5.x), старіші версії програми "Анкрон" працюють ТОЛЬКО при завантаженні. Він працює з новішими системами (наприклад, RHEL 6.x).

З цим anacronможна планувати завдання більш гнучко, наприклад, виконувати роботу X раз на тиждень. Також anacronвиконує завдання, коли комп'ютер стає доступним, тобто вам не доведеться враховувати, коли система працює або вниз.

Щоб запускати сценарій кожні другий тиждень, потрібно додати рядок, подібний до наступного, до / etc / anacrontab:

14 5 myScript script.sh

Перегляньте детальну сторінку сторінки.


Використання anacron, очевидно, є найчистішим рішенням ІМО (якщо це не має деяких небажаних наслідків для деяких людей).
JanC

0

Я не впевнений, чи є більш елегантний спосіб визначити кожен другий тиждень, але це може допомогти вам.

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

Це запустить сценарій о 6:00 ранку першого та третього четверга місяця.


2
Це закінчилося б, пропускаючи тиждень, якщо є місяць з 3 четвергом, хоча.
David Z

1
Чи є місяць, у якого є лише 3 четверги? Хоча я можу бачити, як це пропускає тиждень, якщо є 5 четвергів. Його можна оновити до 1-7,15-21,29-31, але тоді він би запускався назад, якщо були відповідність для останнього набору ...
pferate

1
Під 3 четвер ти мав на увазі 3 четверги, що сценарій буде виконуватися, а не 3 загальні четверги? Можливо, я його неправильно прочитав вперше.
pferate

0

Я б запускав його щотижня і мав би перевірити сценарій, щоб побачити, чи є номер тижня непарним номером: якщо так, вихід.

Для цього потрібно було б ще трохи думки, щоб працювати з грудня по січень.

Можливо, у сценарію встановлено файл прапора "останній успішний запуск". Коли сценарій запускається, перевірте, чи файл прапора востаннє змінено 14 днів тому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.