Як запланувати роботу за тиждень?


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

Ви можете запускати річ за кроном щосереди, а потім вирішуйте, чи це тиждень чи непарний тиждень. наприклад:

#!/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

Попаде в першу та третю середу місяця.


це трохи елегантніше, ніж метод "зробіть це за сценарієм", але не забудьте додати коментар до свого crontab (загальне правило: якщо у вас є більше одного -чи /залученого, можливо, варто прокоментувати, щоб описати розклад)
voretaq7

Я підозрюю, що це неправильно; це призведе до запуску роботи з 1 по 7 та 15-21 числа кожного місяця, а також кожної середи. Це з man 5 crontab: " День виконання команди може бути визначений двома полями - день місяця та день тижня. Якщо обидва поля обмежені (тобто не є *), команда буде виконуватися, коли будь-яке поле відповідає сумі Наприклад, "30 4 1,15 * 5" призведе до запуску команди о 4:30 1-го та 15-го числа кожного місяця плюс щоп'ятниці "(мій наголос).
MadHatter

1
Насправді, це залежить від того, який крон-демон ви використовуєте. Здається, ваш запис походить з vixie cron (входить до дистрибутива RedHat). Від "man crontab" на кроні dillo (Slackware): Якщо ви вкажете і день у місяці, і день тижня, * він буде інтерпретуватися як N-й такий день у місяці *. Однак сценарій рішення (обчислення кількості тижнів) виглядає як єдине портативне рішення.
AlvaroGMJ

2

Для того, що потрібно запускати кожен другий тиждень, використовуйте цей однострочний:

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

Цей сценарій планується запустити по п’ятницях. Тиждень, який слід виконати, можна скорегувати, використовуючи "-eq 0" або "-eq 1"


1

Анакрон - хороший спосіб вирішення обмежень крона.

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

команда ідентифікатор завдання затримки періоду

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


На жаль, анакрон не можна використовувати. Забув це згадати.
Роман

1

Якщо ваші потреби не є буквально двотижневими, ви можете просто запустити роботу на 1 і 15 числа місяця:

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

Що працює о 8:15 першого та п’ятнадцятого кожного місяця незалежно від дня тижня.


-2

З цього налаштування для пояснень 3/2 на тижневому полі слід виконувати завдання в будь-яку іншу середу - це неявне, але я думаю, що можна виконати.


ні, це еквівалентно for(int i=3; i <=3 ; i+=2) {} тому, що він переживає це лише один раз, не має значення, якщо «крок» дорівнює 1 або 2.
тушкуйте

Що сказав @stew Крім того, немає "тижневого поля".
Роман

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