Cron работа каждые три дня - PullRequest
71 голосов
/ 29 декабря 2010

Можно ли запускать cronjob каждые три дня? Или, может быть, 10 раз / месяц.

Ответы [ 11 ]

97 голосов
/ 29 декабря 2010

Запускай каждые три дня ...

0 0 */3 * *

Как насчет этого?

Если вы хотите, чтобы он запускался в определенные дни месяца, такие как 1-е, 4-е, 7-е и т. Д., То в вашем сценарии можно просто указать условие, проверяющее текущий день месяца. *

if (((date('j') - 1) % 3))
   exit();

или, как указывает @mario, вы можете использовать дату ('k'), чтобы получить день года вместо того, чтобы делать это в зависимости от дня месяца.

61 голосов
/ 17 января 2011
* * */3 * *  that says, every minute of every hour on every three days. 

0 0 */3 * *  says at 00:00 (midnight) every three days.
12 голосов
/ 18 октября 2014

Поскольку cron «не имеет состояния», он не может точно выразить «частоты», только «паттерны», которые он (очевидно) постоянно сопоставляет с текущим временем.

Перефразирование вашего вопроса делает это более очевидным: «возможно ли запускать cronjob в 00:01 каждый вечер, кроме пропущенных ночей, когда он пробежал в течение 2 ночей?» Когда cron сравнивает текущее время с шаблонами времени запроса на работу, cron не может узнать, выполнял ли он вашу работу в прошлом.

(безусловно, можно написать хрон с сохранением состояния, который записывает прошлые задания и, следовательно, включает шаблоны для сопоставления с этим состоянием, но это не стандартный крон, включенный в большинство операционных систем. Такая система усложнялась бы, если бы потребовалось ввести понятие, когда такие шаблоны «сбрасываются». Например, является ли шаблон сбрасываемым при изменении времени (то есть запись crontab пересматривается)? Посмотрите в своем любимом приложении-календаре, чтобы узнать, насколько сложно это может быть, чтобы выразить Повторяющиеся шаблоны по расписанию и обратите внимание, что у них нет проблемы сброса, потому что у начального календарного события есть естественная дата «начала» / / / «сброса». Попробуйте переназначить повторяющееся календарное событие каждую неделю, чтобы отложить на неделю Например, на Рождество. Обычно вам нужно прекратить это повторяющееся событие и перезапустить совершенно новое, что иллюстрирует ограниченную выразительность того, как даже сложные приложения календаря представляют повторяющиеся шаблоны. И, конечно, Календарь У них много состояний - каждое отдельное событие может быть удалено или перенесено независимо [в большинстве приложений календаря]).

Кроме того, вы, вероятно, хотите выполнять свою работу каждую 3-ю ночь в случае успеха , но если последняя не удалась, повторите попытку немедленно, возможно, на следующую ночь (не ждите еще 3 дня) или даже раньше Примерно через час (но перестаньте повторять попытки по прибытии утром). Очевидно, что cron не может знать, была ли ваша работа успешной, и шаблон не может также отображать альтернативное, более частое расписание «повторных попыток».

ANYWAY-- Ты можешь делать то, что хочешь сам. Напишите сценарий, скажите, чтобы cron запускал его по ночам в 00:01. Этот сценарий может проверять временную метку чего-то *, которая записывает «последний запуск», и, если это было> 3 дня назад **, выполнить задание и сбрасывать метку времени «последнего запуска».

(* этот индикатор с отметкой времени является немного постоянным состоянием, которое вы можете манипулировать и исследовать, но которое cron не может)

** будьте осторожны с арифметикой времени, если вы используете удобочитаемое время - два раза в год, в некоторые дни по 23 или 25 часов в день, и 02: 00-02: 59 происходит дважды за один день или нет вообще. Используйте UTC, чтобы избежать этого.

9 голосов
/ 05 июля 2017

Я не специалист по cron, но как насчет:

0 */72 * * *

Он будет работать каждые 72 часа без перерыва.

https://crontab.guru/#0_/72___

7 голосов
/ 04 мая 2015
0 0 1-30/3 * *

Это будет выполняться каждые три дня, начиная с 1-го. Вот 20 запланированных запусков -

  • 2015-06-01 00: 00: 00
  • 2015-06-04 00: 00: 00
  • 2015-06-07 00: 00: 00
  • 2015-06-10 00: 00: 00
  • 2015-06-13 00: 00: 00
  • 2015-06-16 00: 00: 00
  • 2015-06-19 00: 00: 00
  • 2015-06-22 00: 00: 00
  • 2015-06-25 00: 00: 00
  • 2015-06-28 00: 00: 00
  • 2015-07-01 00: 00: 00
  • 2015-07-04 00: 00: 00
  • 2015-07-07 00: 00: 00
  • 2015-07-10 00: 00: 00
  • 2015-07-13 00: 00: 00
  • 2015-07-16 00: 00: 00
  • 2015-07-19 00: 00: 00
  • 2015-07-22 00: 00: 00
  • 2015-07-25 00: 00: 00
  • 2015-07-28 00: 00: 00
3 голосов
/ 29 июля 2015

Как насчет:

00 00  *  *   * every 3 days && echo test

Где every - это скрипт:

#!/bin/sh

case $2 in
    days)
        expr `date +%j` % $1 = 0 > /dev/null
        ;;

    weeks)
        expr `date +%V` % $1 = 0 > /dev/null
        ;;

    months)
        expr `date +%m` % $1 = 0 > /dev/null
        ;;
esac

Так что он выполняется каждый день.3-го, 6-го, ... 27-го, 30-го числа месяца, но в этом случае неправильно после того, как месяц имеет 31-й день.Сценарий every неверен только после конца года.

2 голосов
/ 08 июня 2017

Вы должны изучить основы crontab.

Редактировать cron с помощью команды crontab -e, а затем ⌃ (CTRL) + X затем Y и, наконец, нажмите ENTER (возврат) на Mac, чтобы сохранить файл.Вы можете проверить, установлены ли новые кроны не по crontab -l

В файле crontab есть пять полей для указания минут, часов, дня месяца, месяца и дня недели.с последующей командой, выполняемой с этим интервалом.

*     *     *   *    *   command to be executed
-     -     -   -    -
|     |     |   |    |
|     |     |   |    +----- day of week (0-6) (Sunday=0)
|     |     |   +------- month (1-12)
|     |     +--------- day of month (1-31)
|     +----------- hour (0-23)
+------------- min (0-59)

* в приведенном выше поле значений означает все допустимые значения, указанные в скобках для этого столбца.

Здесь,Я написал подробный пост об этом: Настройка Cron в Unix

1 голос
/ 10 марта 2019

Не думаю, что у вас есть то, что вам нужно:

0 0 */3 * * ## <<< WARNING!!! CAUSES UNEVEN INTERVALS AT END OF MONTH!!

К сожалению, * / 3 устанавливает интервал на каждый n день месяца и не каждые n дней .См .: объяснение здесь .В конце месяца гарантирован повторный выпуск.

1st  at 2019-02-01 00:00:00
then at 2019-02-04 00:00:00 << 3 days, etc. OK
then at 2019-02-07 00:00:00
...
then at 2019-02-25 00:00:00
then at 2019-01-28 00:00:00
then at 2019-03-01 00:00:00 << 1 day WRONG
then at 2019-03-04 00:00:00
...

В соответствии с этой статьи вам нужно добавить некоторые математические выражения к выполняемой команде, чтобы получить ИСТИНА «каждые N дней».Например:

0 0 * * *  bash -c '(( $(date +\%s) / 86400 \% 3 == 0 )) && runmyjob.sh

В этом примере задание будет проверяться ежедневно в 12:00, но будет выполняться только тогда, когда число дней с 01-01-1970 по модулю 3 равно 0.

Если вы хотите, чтобы это было каждые 3 дня с определенной даты, используйте следующий формат:

0 0 * * *  bash -c '(( $(date +\%s -d "2019-01-01") / 86400 \% 3 == 0 )) && runmyjob.sh
1 голос
/ 29 декабря 2010

Было бы проще, если бы вы настроили его, например, на запуск. по понедельникам и четвергам, что даст ему 3 и 4-дневный перерыв.

В противном случае настройте его на ежедневную работу, но сделайте так, чтобы ваш скрипт php cron завершился рано:

if (! (date("z") % 3)) {
     exit;
}
0 голосов
/ 03 ноября 2017

0 0 * * * [ $(($(( дата +% - j - 1)) % 3)) == 0 ] && script

Получите день года из date, смещение от 1 до 0, проверьте, по модулю ли это три.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...