Назад | Перейти на главную страницу

Что означает «каждые две минуты» в cron?

У меня есть два скрипта в cron, которые запускаются каждые две минуты: */2 - дело в том, что они не в ногу. Один длится 1,3,5,7,9 минуты и т. Д., А другой - 0,2,4,6,8. Это не критичная проблема, но означает, что у меня есть два отчета о состоянии, один из которых немного устарел по сравнению с другим.

Что именно делает cron? Запустить первый в порядке документа crontab, дожидаясь завершения выполнения второго?

Есть ли способ сделать пробежку одновременно или как можно ближе?

Задание будет выполнено как можно ближе к заданному времени, но может быть выполнено несколько позже. Как предположил Крис, лучше всего, вероятно, создать небольшой сценарий оболочки и запланировать его:

#!/bin/sh
/path/to/job/one &
/path/to/job/two &

В этом случае я запустил их в фоновом режиме, чтобы убедиться, что они работают одновременно или почти одновременно, но в зависимости от вашей системы, ваших требований и т. Д. Вам придется настроить это в соответствии с вашими потребностями.

Также обратите внимание, что в некоторых системах * / 2 не фактически означают только время, кратное 2, но повторяются с шагом, равным 2. Таким образом, если время задания соответствует 1 при первоначальном запуске задания, оно может выполняться затем каждую нечетную минуту, как вы видите, а не каждую четную . Вы можете попробовать что-то вроде:

00-58/2

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

Мне кажется, что лучше всего объединить два сценария в один, чтобы гарантировать, что они запускаются почти в одинаковое время.

Другой вариант, помимо создания третьего (внешнего) сценария, - объединить оба отчета в одну командную строку и поместить ее в cron:

*/2 * * * *  /path/to/job1 ; /path/to/job2

Нет, crontab периодически проверяет cron для обновления своего расписания. Расписания в каждой строке crontab чередуются в глобальное расписание. Если у вас есть строка 1,3,5,7,9 и строка 2,4,6,8,10, вы получите результат 1,2,3,4,5,6,7,8,9, 10.

Из Википедия Алгоритм, используемый (классическим) cron, следующий:

  1. При запуске найдите файл с именем .crontab в домашних каталогах всех владельцев учетных записей.
  2. Для каждого найденного файла crontab определите следующий раз в будущем, когда каждая команда должна быть запущена.
  3. Поместите эти команды в список событий Franta-Maly (IIRC, это эффективная структура очереди приоритетов) с указанием их соответствующего времени и их спецификатора времени "пяти полей".
  4. Войдите в основной цикл:

    1. Изучите запись задачи в начале очереди, вычислите, как далеко в будущем она должна быть запущена.
    2. Спите в течение этого времени.
    3. После пробуждения и проверки правильного времени выполните задачу в начале очереди (в фоновом режиме) с привилегиями пользователя, который ее создал.
    4. Определите следующий раз в будущем, чтобы запустить эту команду, и поместите ее обратно в список событий для этого значения времени.

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