Cronjob працює кожні два тижні, у суботу, починаючи з цієї суботи


11

Сьогодні п’ятниця, 3 жовтня 2014 р. 3:58

Я хочу запланувати такий кронжаб, щоб запустити його на наступні дати:

  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: арифметичний тест (рівний), в цьому випадку результат булевий

&& yourCommand: Boolean AND: запускати yourCommandлише якщо результат попередньої команди був булевим true

Зауважте, що рік може отримати два непарні тижні: 53 (цього року) та 1 (наступного року)


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

@Cyrus дякую за вашу відповідь, але якщо я напишу * * * * 5 тестових $ (($ (дата +% W)% 2)) -eq 1 && /u02/restore/scripts/test.sh скрипт не запустити, але якщо я напишу * * * * 5 /u02/restore/scripts/test.sh запускається сценарій. чому ваше вираження не працює? Я тільки перевіряв справи. І виявив, що не працює якось.
купа

1
Моя помилка. Cron трактує% як новий рядок. Втечі обидва% із знаком \ у вашій роботі:0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
Сайрус

До жаль , щоб повернути цей старий питання , але він не працює для мене , і коли я намагаюся виконати $((10#$(date +%W)%2)) -eq 1 && echo OKмої оболонки намагаються виконати результат обчислення тижня: -bash: 1: command not found. Будь-яка підказка, чому це робить? Дякую.
jhuet

3
@jhuet: testнемає користувача це команда ita . Спробуйте:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Сайрус

4

Те, що ви показали, - "щотижня". Тоді код:

0 8 * * 6

Ви впевнені, що потрібно запускати його кожні два тижні?

0 8 * * 6 expr `date +\%s` / 604800 \% 2 >/dev/null || yourCommand

1
Чи можете ви пояснити команду, будь ласка
купа

1
Краще використовувати те, що дав Сайрус - $ (($ (дата +% W)% 2)) "W" означає тижневе число рік. Починаючи з нуля до 53. Якщо це можна розділити на два, то це ваш "щосекунди" тиждень. Отже, cronjob працює щотижня, але команда 'expr' виконує команду yourCommand лише у тому випадку, якщо число тижня можна розділити на 2.
Glueon

коли я запускаю тестовий $ (($ (дата +% W)% 2)) -eq 1 у командному рядку нічого не повертає, чому?
купа

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