Рейтинг:1

Задание Cron задерживается примерно на 1 секунду

флаг us

Я запускаю следующую работу cron

* * * * * date "+\%Y\%m\%dT\%H\%M\%S" > /path/to/log 2>&1

но он бежит на секунду слишком поздно, как пишет, например.

20210817T210001

Как я могу гарантировать, что задание cron будет выполняться всю минуту?

RonJohn avatar
флаг cn
Должно быть очевидно, если немного подумать, что cron требует времени, чтобы «проснуться», просканировать все crontabs и определить, нужно ли запускать запись. Это суровая правда.
Andrej Podzimek avatar
флаг cn
Если вам требуется такая точность синхронизации — что также может указывать на неправильный выбор программного обеспечения для конкретной цели — просто используйте таймеры `systemd` вместо полностью устаревшей установки `cron`. С таймерами `systemd` вы получаете ручки настройки, необходимые для достижения баланса между точностью синхронизации и накладными расходами на диспетчеризацию. `AccuracySec` (которое может иметь значения в μs, если это необходимо) — это ключевое слово для поиска [в документации] (https://www.freedesktop.org/software/systemd/man/systemd.timer.html). Кроме того, если все дело в регистрации хорошей круглой метки времени, тогда просто округляйте метку времени.
Рейтинг:12
флаг vn

Это также рассматривается на Ошибка сервера.

Я лично поддерживаю эту цитату: «Что cron может гарантировать, так это то, что ваша работа начнется не раньше указанного времени». Другими словами, cron на самом деле не предназначен для хирургической точности до секунды. Большинство моих собственных заданий cron также начинаются с 01 или даже 02 секунды после полной минуты.

Чтобы задания cron запускались, cron сканирует, какие задания необходимо запускать в любой момент времени. Это не ошибка, если задание, запланированное на 12:00:00, на самом деле начнется в 12:00:01, поскольку время инициализации cron может варьироваться в зависимости от ряда факторов.

Если вам нужно что-то, чтобы вызвать «почти» (спасибо, Кевин) ровно в секунду, вам следует искать другое решение, чем cron, например системад таймеры (спасибо Андрей), скрипт на Python или даже программу на C, которая следит за временем за вас.

РЕДАКТИРОВАТЬ: В качестве альтернативы (как предложил Нонни Муз) вы можете запланировать запуск скрипта на одну минуту раньше, а затем отслеживать время, чтобы он работал как можно точнее, когда вы хотите, чтобы он запускался.

Irsu85 avatar
флаг cn
И затем вы можете использовать crontab для запуска этого скрипта при перезагрузке.
Artur Meinild avatar
флаг vn
Да, в самом деле! :-)
Nonny Moose avatar
флаг in
Вы даже можете запустить cron свою программу, скажем, на минуту раньше, а затем постоянно отслеживать время, пока она не запустится.
флаг ua
Педантично: у вас *не может* быть что-то, "срабатывающее ровно в секунду". Вы работаете в операционной системе с упреждающей многозадачностью. Ядро запланирует ваш процесс так, чтобы он задействовал ЦП, когда ядро ​​сочтет это нужным, а не в конкретную секунду. Если вам это не нравится, вам придется использовать [sched(7)](https://man7.org/linux/man-pages/man7/sched.7.html), чтобы запросить планирование в реальном времени. гарантии, которые все еще не совершенны, так как ядро ​​имеет ненулевые накладные расходы планирования.

Ответить или комментировать

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