Предположим, у меня есть работа в CRON
30 2 * * * ....
Тогда это будет запускаться каждый раз, когда будет 2:30 ночи (по местному времени).
Теперь предположим, что у меня есть часовой пояс Europe/Germany, и это 2017-10-29 (день переключения на летнее время). Тогда это задание CRON будет выполняться дважды, верно?
Предположим, у меня есть часовой пояс Europe/Germany и задание CRON
30 11 * * * ....
Поскольку в Германии никогда не переходили на летнее время в 11:30, это не помешает. Но пользователь мог изменить местное время. Чтобы быть предельно ясным: Этот вопрос НЕ о летнем времени.
Для следующих тестовых случаев я хотел бы знать, будет ли / как часто запланировано задание CRON:
Они сводятся к Как быстро срабатывает CRON?, где у 4-го также есть вопрос, хранит ли CRON, что он уже был выполнен в эту минуту.
Другой вариант того же вопроса:





В 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.
Прочитав это, я все еще не знаю ответа на свой вопрос.
Не знаю, как я могу быть более точным по этому поводу. Если ваша работа не во время смены времени -> нормальное поведение Для каждой часовой работы: вы получили работу в 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 по умолчанию запускается каждую минуту.
Честно говоря, это вполне ожидаемое поведение. Если в вашем дне 25 часов и вы выполняете задание каждый час, то оно будет выполняться 25 раз. Если будет 23 часа, то он будет работать 23 раза. Если вы выполняете задание каждый день, то оно будет выполняться один раз в день.
Вот моя ментальная модель CRON: это просто еще один процесс, управляемый операционной системой. Это означает, что время выполнения назначается всякий раз, когда ОС решает. Хотя это маловероятно, но нет гарантии, что работа будет выполнена в заданные сроки. На самом деле, я ожидал бы, что задание CRON будет выполнять не реже одного раза в минуту. Но, может быть, не каждые 500 мс. За это время NTP мог обновлять системное время. Это обновление может длиться больше минуты. Если CRON не имеет возможности узнать, что произошло обновление, он просто не выполнит свою работу.
Мой вопрос НЕ о летнем времени, а о других изменениях местного времени. Думаю, я ясно дал это понять, сказав: «Поскольку в Германии никогда не было перехода на летнее время в 11:30, это не помешает. Но пользователь может изменить местное время».
Человек, прочти документ! Это совершенно ясно. Если пришло время изменения, связанные с смещением GMT, вы можете обработать это с помощью -s, если нет, это будет поведение по умолчанию. В вашем случае это поведение по умолчанию. Cron запускается каждые минуты, поэтому, если часы меняют минуты, он выполняет все задания, соответствующие запросу времени, который вы определили в своем файле. Представьте, что вы запускаете cron вручную каждую минуту, и у вас будет такое поведение. Вдобавок ко всему, все ваше описание зависит от ОС в отношении того, как обрабатываются часы и планировщик, нет ссылки на CRON.
Кроме того, я не понимаю, почему вы просто не пытаетесь это сделать? CRON поддерживает только минуты, то есть вы можете легко выполнить задание в 11:30:00 часов в 11:30:25, перемотать его на 11:29:25 и подождать 35 секунд, пока CRON будет выполнен. Я не понимаю, почему вы вообще смотрите на таймфрейм мс.
Я не «просто пробую», потому что это не так просто. Я не могу контролировать планировщик ОС / системное время на таком уровне. Я не говорю, что это проблема, которая часто возникает. Я спрашиваю, МОЖЕТ ли возникнуть такая проблема. Это похоже на состояние гонки. Вы когда-нибудь пробовали «просто попробовать» условие гонки?
Конечно, вы можете попробовать состояние гонки. Имея правильные настройки параметров, правильное тестирование, вы можете протестировать и воспроизвести его. К счастью, вы можете это сделать, или вы почти никогда не сможете определить свое состояние гонки.
Самый простой способ с уверенностью ответить на этот вопрос - взглянуть на исходный код демона cron. В Интернете есть несколько версий, например это, или вы можете использовать apt-get source cron.
Цикл тика в cron состоит в том, чтобы несколько раз засыпать в течение минуты или меньше, если предстоит работа. Сразу после выхода из спящего режима он проверяет время и обрабатывает результат как одно из следующих значений wakeupKind:
В случае сомнений источник четко комментирует эти wakeupKind значения.
Редактировать
Чтобы выяснить, может ли изменение часов повлиять на sleep(), похоже, ответ косвенно содержится в паре страниц руководства Linux.
nanosleep().CLOCK_MONOTONIC (хотя POSIX.1 говорит, что не должен)CLOCK_MONOTONIC, в котором объясняется, что на него не влияют скачки системного времени, но на него могут повлиять инкрементальные настройки синхронизации часов в стиле NTP.Таким образом, изменение часов в стиле системного администратора не повлияет на sleep(). Но, например, если вошли настройки NTP и сказали «осторожно» продвинуть часы, cron испытает серию немного коротких вызовов функций sleep().
Спасибо! Думаю, это в значительной степени то, что я искал. Кто-то упомянул, что sleep (x) не зависит от системного времени. У вас есть ресурс, который объясняет, как работает сон / какие системные ресурсы ему нужны?
Пора поговорить о CLOCK_MONOTONIC в ядре Linux. Смотрите обновленную информацию об ответе.
Вот ваша заслуженная награда. Спасибо :-)
На самом деле вы задаете два связанных вопроса. Общий ответ: это зависит от [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 проснется?
Минута, определенная для сна до истечения 60 секунд с момента последнего срабатывания (т. Е. На основе вызова чего-либо в строке сна (), а не абсолютного времени), а затем корректировки на любые прерывания (например, изменения, связанные с DST или NTP) при пробуждении снова вверх. Не уверен, откуда берутся 30 мс: в большинстве сред у вас будет время пинга от 10 до 100 мс, поэтому попытки отрегулировать время, которые часто будут бесполезны, поскольку большая часть того, что должен делать NTP, - это измерение задержки сети. и джиттер в более длительные периоды времени.
30 мс - это просто число, которое я придумал, чтобы обеспечить ответ на свой вопрос. Я мог бы написать вредоносный скрипт, который изменяет время случайным образом и часто. Этот вопрос не о нормальном случае, а о возможных плохих случаях. С помощью этого воображаемого вредоносного сценария нужно знать неприятные подробности. Что вообще значит «спать 60 секунд», если системное время случайным образом меняется каждые 30 мс?
Это не повлияет на следующий запуск cron, поскольку такие вызовы, как sleep (), основаны на таймеры (т. Е. Схема синхронизации, которая работает независимо от системного времени), а не на время (т. Е. Часы реального времени на вашем компьютере). Поэтому я ожидал, что cron будет срабатывать снова, как ожидалось, через минуту (и будет продолжать делать это каждые 60 секунд), но на вопрос о том, как он будет обрабатывать патологический случай, когда вредоносная программа вмешивается в системное время, я не мог ответить. Но давайте будем честными, это еще один и другой вопрос.
Существует множество реализаций систем 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
Я считаю, что это отвечает на большинство ваших вопросов.
В дополнение к пятому пункту:
- 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 и, вероятно, многих других):
Интересная информация:
«Этого не должно происходить» не является ответом на «что произойдет, если ...».
Думаю, ваш пятый пункт самый интересный.