Задание каждые три дня



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

834   10  

10 ответов:

запустить его каждые три дня...

0 0 */3 * *

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

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

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

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

* * */3 * *  that says, every minute of every hour on every three days. 

0 0 */3 * *  says at 00:00 (midnight) every three days.

поскольку cron является "безгосударственным", он не может точно выражать" частоты", только" шаблоны", которые он (по-видимому) непрерывно соответствует текущему времени.

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

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

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

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

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

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

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

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

0 */72 * * *

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

https://crontab.гуру/#0_ / 72___

как насчет:

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

здесь every сценарий:

#!/bin/sh

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

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

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

так он работает каждый день.

используя */3 работает на 3-й, 6-й, ... 27-го, 30-го числа месяца, но затем неправильно после того, как месяц имеет 31-й день. Элемент every сценарий только после окончания года.

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

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

if (! (date("z") % 3)) {
     exit;
}

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

редактировать cron по команде crontab -e а то ⌃ (CTRL) + X затем Y и, наконец, нажмите клавишу ENTER (return) на 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-й, 4-й, 7-й и т. д... тогда вы можете просто иметь условное в вашем скрипте, который проверяет на текущий день месяца.

Я думал, что все, что вам нужно для этого, было вместо */3, Что означает каждые три дня, используйте 1/3, что означает каждые три дня, начиная с 1-го числа месяца. так 7/3 означало бы каждые три дня, начиная с 7-го месяца и т. д.

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

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

Comments

    Ничего не найдено.