Как быстро срабатывает CRON?

Первый пример

Предположим, у меня есть работа в CRON

 30 2 * * * ....

Тогда это будет запускаться каждый раз, когда будет 2:30 ночи (по местному времени).

Теперь предположим, что у меня есть часовой пояс Europe/Germany, и это 2017-10-29 (день переключения на летнее время). Тогда это задание CRON будет выполняться дважды, верно?

Второй пример

Предположим, у меня есть часовой пояс Europe/Germany и задание CRON

 30 11 * * * ....

Поскольку в Германии никогда не переходили на летнее время в 11:30, это не помешает. Но пользователь мог изменить местное время. Чтобы быть предельно ясным: Этот вопрос НЕ о летнем времени.

Для следующих тестовых случаев я хотел бы знать, будет ли / как часто запланировано задание CRON:

  1. В 11:29: 58.0 пользователь устанавливает время на 11:31:00.
  2. В 11: 29: 59.1 пользователь устанавливает время на 11:31:00.
  3. В 11: 29: 59.6 пользователь устанавливает время на 11:31:00.
  4. В 11: 30: 01.0 пользователь устанавливает время на 11: 29: 59.7 - выполняется ли CRON сразу после этого?

Они сводятся к Как быстро срабатывает CRON?, где у 4-го также есть вопрос, хранит ли CRON, что он уже был выполнен в эту минуту.

Другой вариант того же вопроса:

  1. В 11:29:59 служба NTP исправляет время на 11:31:00 - будет ли задание вообще выполнено в этот день?

Думаю, ваш пятый пункт самый интересный.

kvantour 25.09.2018 09:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
1
3 208
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

В Mac OS:

$> man cron
...
Available options:

 -s      Enable special handling of situations when the GMT offset of the local timezone changes, such as the switches between the standard time and daylight saving time.

         The jobs run during the GMT offset changes time as intuitively expected.  If a job falls into a time interval that disappears (for example, during the switch from standard time) to daylight saving time
         or is duplicated (for example, during the reverse switch), then it is handled in one of two ways:

         The first case is for the jobs that run every at hour of a time interval overlapping with the disappearing or duplicated interval.  In other words, if the job had run within one hour before the GMT
         offset change (and cron was not restarted nor the crontab(5) changed after that) or would run after the change at the next hour.  They work as always, skip the skipped time or run in the added time as
         usual.

         The second case is for the jobs that run less frequently.  They are executed exactly once, they are not skipped nor executed twice (unless cron is restarted or the user's crontab(5) is changed during
         such a time interval).  If an interval disappears due to the GMT offset change, such jobs are executed at the same absolute point of time as they would be in the old time zone.  For example, if exactly
         one hour disappears, this point would be during the next hour at the first minute that is specified for them in crontab(5).

 -o      Disable the special handling of situations when the GMT offset of the local timezone changes, to be compatible with the old (default) behavior.  If both options -o and -s are specified, the option
         specified last wins.

Прочитав это, я все еще не знаю ответа на свой вопрос.

Martin Thoma 17.09.2018 19:49

Не знаю, как я могу быть более точным по этому поводу. Если ваша работа не во время смены времени -> нормальное поведение Для каждой часовой работы: вы получили работу в xx: 30, смена с 2 до 3 часов ночи, ваша работа в 2:30 пропускается. То же самое смена задания - с 2 часов 59 минут до 2 часов ночи, ваше задание в 2:30 запускается дважды. Задание с большим интервалом (например, дневное задание) such jobs are executed at the same absolute point of time as they would be in the old time zone Итак, вы получили задание в 2:30 каждый день, время идет с 2 до 3 часов ночи, задание будет выполняться в 3:30 Та же работа, время идет 2:59 -> 2 часа, работа была запущена в 2:30. Для №2 cron по умолчанию запускается каждую минуту.

Marc Simon 20.09.2018 03:16

Честно говоря, это вполне ожидаемое поведение. Если в вашем дне 25 часов и вы выполняете задание каждый час, то оно будет выполняться 25 раз. Если будет 23 часа, то он будет работать 23 раза. Если вы выполняете задание каждый день, то оно будет выполняться один раз в день.

Marc Simon 20.09.2018 03:18

Вот моя ментальная модель CRON: это просто еще один процесс, управляемый операционной системой. Это означает, что время выполнения назначается всякий раз, когда ОС решает. Хотя это маловероятно, но нет гарантии, что работа будет выполнена в заданные сроки. На самом деле, я ожидал бы, что задание CRON будет выполнять не реже одного раза в минуту. Но, может быть, не каждые 500 мс. За это время NTP мог обновлять системное время. Это обновление может длиться больше минуты. Если CRON не имеет возможности узнать, что произошло обновление, он просто не выполнит свою работу.

Martin Thoma 20.09.2018 08:28

Мой вопрос НЕ о летнем времени, а о других изменениях местного времени. Думаю, я ясно дал это понять, сказав: «Поскольку в Германии никогда не было перехода на летнее время в 11:30, это не помешает. Но пользователь может изменить местное время».

Martin Thoma 20.09.2018 08:30

Человек, прочти документ! Это совершенно ясно. Если пришло время изменения, связанные с смещением GMT, вы можете обработать это с помощью -s, если нет, это будет поведение по умолчанию. В вашем случае это поведение по умолчанию. Cron запускается каждые минуты, поэтому, если часы меняют минуты, он выполняет все задания, соответствующие запросу времени, который вы определили в своем файле. Представьте, что вы запускаете cron вручную каждую минуту, и у вас будет такое поведение. Вдобавок ко всему, все ваше описание зависит от ОС в отношении того, как обрабатываются часы и планировщик, нет ссылки на CRON.

Marc Simon 21.09.2018 23:27

Кроме того, я не понимаю, почему вы просто не пытаетесь это сделать? CRON поддерживает только минуты, то есть вы можете легко выполнить задание в 11:30:00 часов в 11:30:25, перемотать его на 11:29:25 и подождать 35 секунд, пока CRON будет выполнен. Я не понимаю, почему вы вообще смотрите на таймфрейм мс.

Marc Simon 21.09.2018 23:30

Я не «просто пробую», потому что это не так просто. Я не могу контролировать планировщик ОС / системное время на таком уровне. Я не говорю, что это проблема, которая часто возникает. Я спрашиваю, МОЖЕТ ли возникнуть такая проблема. Это похоже на состояние гонки. Вы когда-нибудь пробовали «просто попробовать» условие гонки?

Martin Thoma 22.09.2018 11:04

Конечно, вы можете попробовать состояние гонки. Имея правильные настройки параметров, правильное тестирование, вы можете протестировать и воспроизвести его. К счастью, вы можете это сделать, или вы почти никогда не сможете определить свое состояние гонки.

Marc Simon 03.10.2018 22:17
Ответ принят как подходящий

Самый простой способ с уверенностью ответить на этот вопрос - взглянуть на исходный код демона cron. В Интернете есть несколько версий, например это, или вы можете использовать apt-get source cron.

Цикл тика в cron состоит в том, чтобы несколько раз засыпать в течение минуты или меньше, если предстоит работа. Сразу после выхода из спящего режима он проверяет время и обрабатывает результат как одно из следующих значений wakeupKind:

  • Ожидаемое время - запускайте любые работы, которые мы ожидали
  • Небольшой прыжок вперед (до 5 минут) - выполняйте задания за прошедшие минуты
  • Средний скачок вперед (до 3 часов, так что это будет включать начало летнего времени весной) - сначала запустите любые задания с подстановочными знаками (потому что наверстывание может занять больше минуты), а затем наверстать упущенное в промежуточных заданиях с фиксированным временем
  • Большой прыжок (3 часа и более в любую сторону) - начать заново с текущего времени
  • Переход назад (до 3 часов, включая конец летнего времени) - поскольку любые задания с фиксированным временем «вероятно» уже были запущены, запускайте любые задания с подстановочными знаками только до тех пор, пока время снова не истечет.

В случае сомнений источник четко комментирует эти wakeupKind значения.


Редактировать

Чтобы выяснить, может ли изменение часов повлиять на sleep(), похоже, ответ косвенно содержится в паре страниц руководства Linux.

  • Во-первых, примечания для функция sleep () подтверждают, что реализовано nanosleep().
  • В примечаниях к наносон () говорится, что Linux измеряет время с помощью часов CLOCK_MONOTONIC (хотя POSIX.1 говорит, что не должен)
  • Прокрутите немного вниз в документации для clock_settime (), чтобы увидеть объяснение CLOCK_MONOTONIC, в котором объясняется, что на него не влияют скачки системного времени, но на него могут повлиять инкрементальные настройки синхронизации часов в стиле NTP.

Таким образом, изменение часов в стиле системного администратора не повлияет на sleep(). Но, например, если вошли настройки NTP и сказали «осторожно» продвинуть часы, cron испытает серию немного коротких вызовов функций sleep().

Спасибо! Думаю, это в значительной степени то, что я искал. Кто-то упомянул, что sleep (x) не зависит от системного времени. У вас есть ресурс, который объясняет, как работает сон / какие системные ресурсы ему нужны?

Martin Thoma 28.09.2018 12:23

Пора поговорить о CLOCK_MONOTONIC в ядре Linux. Смотрите обновленную информацию об ответе.

df778899 28.09.2018 19:41

Вот ваша заслуженная награда. Спасибо :-)

Martin Thoma 28.09.2018 23:07

На самом деле вы задаете два связанных вопроса. Общий ответ: это зависит от [1], но я отвечу на основе установки Debian Linux, в которой я сейчас использую:

Как cron обрабатывает изменения летнего времени и другие «особые» события, связанные со временем?

В моей системе Debian Linux cron обрабатывает «летнее время и другие изменения / исправления, связанные со временем» (согласно странице руководства), так что задания не запускаются дважды или пропускаются из-за таких изменений, как DST. (См. https://debian-handbook.info/browse/stable/sect.task-scheduling-cron-atd.html для более подробной информации). Относительно пятого пункта, поднятого в вашем втором вопросе, я ожидал бы, что эти же средства будут иметь дело с временными скачками, связанными с NTP, но я не знаю наверняка.

Как часто запускается cron и как быстро он принимает мои изменения crontab?

Опять же, в моей системе Debian Linux демон cron просыпается раз в минуту и ​​обнаруживает и использует любые изменения crontab с момента предыдущей проверки / запуска минуту назад. Обратите внимание, что нет никакой гарантии, что cron сработает в 12:00:00 или 12:00:59 или в любое конкретное время между ними (только то, что он запускается, когда время составляет 12:00: ??), поэтому в случае изменения crontab в 12:00:17, но cron запущен в 12:00:13, ваши изменения не будут приняты до следующего запуска (скорее всего, в 12:01:13, хотя могут быть небольшие отклонения из-за Планировщик Linux)

[1] Это зависит ...

Точный ответ абсолютно зависит как от платформы (Linux / Unix / BSD / OS X / Windows), так и от конкретной реализации cron (за последние десятилетия было несколько производных от Vixie cron, преобладающих в Linux и BSD согласно https://en.wikipedia.org/wiki/Vixie_cron). Если вы работаете не с Linux, а на странице руководства / документации по вашей реализации должны быть указаны подробности о том, как часто она запускается, собирает измененные crontab, обработку DST и т. д. Если вам действительно нужно знать конкретные детали, df778899 прав в том, что вы должны смотреть исходный код своей реализации по мере необходимости ... потому что иногда программное обеспечение / документация содержат ошибки.

«Опять же, в моей системе Debian Linux демон cron просыпается раз в минуту» - в какую минуту? Минуты UTC или системные минуты? Когда я меняю системное время каждые 30 мс, сомневаюсь, что CRON проснется?

Martin Thoma 26.09.2018 09:12

Минута, определенная для сна до истечения 60 секунд с момента последнего срабатывания (т. Е. На основе вызова чего-либо в строке сна (), а не абсолютного времени), а затем корректировки на любые прерывания (например, изменения, связанные с DST или NTP) при пробуждении снова вверх. Не уверен, откуда берутся 30 мс: в большинстве сред у вас будет время пинга от 10 до 100 мс, поэтому попытки отрегулировать время, которые часто будут бесполезны, поскольку большая часть того, что должен делать NTP, - это измерение задержки сети. и джиттер в более длительные периоды времени.

blihp 26.09.2018 09:38

30 мс - это просто число, которое я придумал, чтобы обеспечить ответ на свой вопрос. Я мог бы написать вредоносный скрипт, который изменяет время случайным образом и часто. Этот вопрос не о нормальном случае, а о возможных плохих случаях. С помощью этого воображаемого вредоносного сценария нужно знать неприятные подробности. Что вообще значит «спать 60 секунд», если системное время случайным образом меняется каждые 30 мс?

Martin Thoma 26.09.2018 09:50

Это не повлияет на следующий запуск cron, поскольку такие вызовы, как sleep (), основаны на таймеры (т. Е. Схема синхронизации, которая работает независимо от системного времени), а не на время (т. Е. Часы реального времени на вашем компьютере). Поэтому я ожидал, что cron будет срабатывать снова, как ожидалось, через минуту (и будет продолжать делать это каждые 60 секунд), но на вопрос о том, как он будет обрабатывать патологический случай, когда вредоносная программа вмешивается в системное время, я не мог ответить. Но давайте будем честными, это еще один и другой вопрос.

blihp 26.09.2018 10:01

Существует множество реализаций систем cron (см. здесь). Один из наиболее часто используемых cron - это Vixie cron. И его страница руководства гласит:

Daylight Saving Time and other time changes

Local time changes of less than three hours, such as those caused by the Daylight Saving Time changes, are handled in a special way. This only applies to jobs that run at a specific time and jobs that run with a granularity greater than one hour. Jobs that run more frequently are scheduled normally.

If time was adjusted one hour forward, those jobs that would have run in the interval that has been skipped will be run immediately. Conversely, if time was adjusted backwards, running the same job twice is avoided.

Time changes of more than 3 hours are considered to be corrections to the clock or the timezone, and the new time is used immediately.

source: man 8 cron

Я считаю, что это отвечает на большинство ваших вопросов.

В дополнение к пятому пункту:

  1. At 11:29:59, the NTP service corrects the time to 11:31:00 - will the job be executed that day at all?

Во-первых, если NTP исправляет время более чем на минуту, у вас очень плохие часы! Это не должно происходить слишком часто. Как правило, у вас может быть такой шаг при включении NTP, но тогда он должен быть намного меньше.

В любом случае, если DeltaT не слишком высокое, обычно ниже 125 мс, ваша система будет убивать времени. Поворот время означает изменение виртуальной частоты программных часов, чтобы часы шли быстрее или медленнее, пока не будет достигнута требуемая коррекция. Чтобы повернуть часы на большее время, также может потребоваться некоторое время. Например, стандартный Linux регулирует время со скоростью 0,5 мс в секунду.

Это подразумевает (в предположении Vixie cron и, вероятно, многих других):

  • Если NTP перескакивает более чем на 3 часа, задание пропускается.
  • Если NTP перескакивает менее 3 часов, но более 125 мс, Vixie cron прекрасно справляется с этой задачей, принимая концепцию временных скачков.
  • Если NTP исправляет время меньше 125 мс, cron не замечает скачок времени из-за поворота.

Интересная информация:

«Этого не должно происходить» не является ответом на «что произойдет, если ...».

Martin Thoma 28.09.2018 12:20

Другие вопросы по теме