Наскільки точним є крон-демон?


22

Чи дійсно точний планувальник роботи cron ?

Я маю на увазі, мені потрібен сценарій, щоб запускати щовечора найновіше можливе, АЛЕ до 00:00 наступного дня.

Я б в ідеалі запустив роботу з крон о 23.59 (або 23:59), але система буде дійсно точною? Оскільки секунда має значення, чи варто мені встановити роботу на крон на 23:58, щоб залишити її на деякий час?


13
Чому ви маєте ці вимоги? У мене є відчуття, що буде кращий спосіб зробити все, що ви насправді намагаєтесь зробити, і ви також можете запитати про це. (На це знадобиться трохи більше зусиль, ніж просто планувати роботу з кроном, але, можливо, не набагато більше.)
David Z

Раніше я використовував старий тупий крон з точністю 10 хвилин.
joshudson

7
Ваша вимога мені здається не дуже надійною. Що робити, якщо ваша система має велике навантаження близько півночі. Якщо у вас немає системи RT, ви нічого не можете гарантувати.
Томас Еркер

Подумайте, що навіть якщо вам вдасться придбати сервер, який завжди доступний і завжди може виконати свою роботу за секунду, все одно можуть піти не так. Наприклад, ваш годинник може почати дрейфувати, не усвідомлюючи цього. Це дійсно, дуже крихко, і я погоджуюся з вищезазначеними коментарями, які потрібно змінити системі.
Кріс Хейс

Відповіді:


24

Що може гарантувати cron, це те, що ваше завдання розпочнеться не раніше зазначеного часу (за умови точності системних годин). Але немає жодної гарантії щодо терміну припинення роботи. Це залежатиме від безлічі факторів:

  • Наскільки завантажена система
  • Що робить робота
  • Повільність через проблеми з обладнанням
  • Повільність через проблеми з мережею (припустимо, що робота залежить від роботи в мережі)

Моя рекомендація полягає в тому, щоб змінити дизайн таким чином, щоб певний час завершення не був вимогою.


1
Найпростіший спосіб зробити це, ймовірно, щоб завдання, яке було запущено через cron, створили файл, який вказує на його запущеність, який видаляється кожного разу, коли робота закінчується (успішно чи невдало), а потім наступне завдання (якщо припустити, що це мета) зачекайте, поки файл зникне, перш ніж він щось зробить.
CVn

@ MichaelKjörling Ви повинні використовувати каталог, а не файл, як перевірку файлу, а потім його створення не атомне .
8bittree

1
@ 8bittree ви також можете використовувати flock, якщо він є.
user9517 підтримує GoFundMonica

1
@ MichaelKjörling Але навіщо турбуватися з, можливо, нормальним випадком, коли правильний випадок також простіший?
8bittree

4
@ 8bittree Якщо ви використовуєте O_CREATта O_EXCLпрапорці, він буде атомним, доки файл знаходиться у локальній файловій системі.
kasperd

14

Я припускаю, що це залежить від вашого демона cron, але документація та стандарт вказують, що якщо ви вкажете хвилини, завдання буде виконано у вказану хвилину.

Побачити:

Майте на увазі, що ваш сценарій буде запущений, коли годинник закінчиться до потрібного часу, але закінчиться через деякий час.


У мене є віртуальний сервер з дуже низьким навантаженням, але крона, яка налаштована працювати щохвилини, запускається іноді з 0s, 1s, 2s, іноді до 17s. Я думаю, що cron може бути менш точним на віртуальному сервері, оскільки інший процес поза цим сервером може вплинути на доступність таких ресурсів, як CPU.
Ліам

8

Зазвичай крон розпочнеться о 23:59:00 , скануйте всі ваші файли crontab, відфільтруйте відповідні для 23:59, а потім запустіть їх. Сканування цих файлів відбувається дуже швидко, оскільки їх не так багато, і всі вони містять лише кілька рядків. Так зазвичай в cronjobs починається в 23:59:00 або 23:59:01 Є впевнені способи навмисно сповільнити цей процес. (додайте, наприклад, мільйони рядків до кронтабу). Якщо система повністю перевантажена, це також не працюватиме так швидко.

Також це очевидно залежить від реалізації.

Якщо вам потрібні дуже точні дати початку, вам краще створити програму, яка спить до потрібного часу, а потім запуститься (наприклад, використовуючи c ++ 11 ). Але в ОС в режимі реального часу це також не буде точно! Також годинник ПК не знає точного часу!

У всіх випадках це лише гарантує, що програма запускається в (більш-менш) потрібний час. Не може бути жодної гарантії того, що програма закінчиться успішно до певного часу, тому я переконаний, що ви повинні щось змінити відповідно до цієї вимоги.


2
Я вважаю, що копійки зберігаються в пам'яті - якщо ви редагуєте файли за crontab безпосередньо (замість crontab -e, який повідомляє про це після завершення), зміни не набудуть чинності. У Cron є уроки простою, щоб розробити, які робочі місця з’являються, він може «спати» до тих пір, поки не закінчиться робота.
AMADANON Inc.

0

Це залежить від загального часу виконання сценарію та точності часу на сервері.

59 23 * * * /some/script/file.sh

запустить ваш сценарій рівно о 23:59, але, якщо у вас є кілька команд, які працюють тривалий час, частина сценарію може бути виконана після півночі.


рівно о 23:59 , так це може бути з 23:59:00 до 23:59:59?
AL

2
У вас немає секунд у звичайному кроні. Щоб отримати ці додаткові 59 секунд, вам потрібно додати "зачекати (59)" у верхній частині коду.
Кіт Генрі

4
@AL на практиці, я завжди бачив, як це працює у xx: xx: 00 або xx: xx: 01, але у сильно завантаженій системі немає і не може бути обіцянок.
варення
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.