cron - cron


cron
Разработчики) AT&T Bell Laboratories
Первый выпуск May 1975 ; 46 лет назад ( 1975-05 )
Написано в C
Операционная система Linux , macOS , FreeBSD
Тип Планировщик заданий

Хроны утилита командной строки, также известная как хроны является планировщиком заданий на Unix-подобные операционные системы . Пользователи, которые настраивают и обслуживают программные среды, используют cron для планирования заданий (команд или сценариев оболочки ), которые будут запускаться периодически в фиксированное время, даты или интервалы. Обычно он автоматизирует обслуживание или администрирование системы, хотя его универсальный характер делает его полезным для таких вещей, как загрузка файлов из Интернета и загрузка электронной почты через регулярные промежутки времени.

Cron лучше всего подходит для планирования повторяющихся задач. Планирование разовых задач можно выполнить с помощью связанной утилиты at .

Обзор

Действия cron управляются файлом crontab (таблица cron), файлом конфигурации, который определяет команды оболочки, которые должны выполняться периодически по заданному расписанию. Файлы crontab хранятся там, где хранятся списки заданий и другие инструкции для демона cron . Пользователи могут иметь свои собственные индивидуальные файлы crontab, и часто существует общесистемный файл crontab (обычно в /etcили в подкаталоге /etc), который могут редактировать только системные администраторы.

Каждая строка файла crontab представляет задание и выглядит следующим образом:

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │                                   7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>

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

Хотя обычно задание выполняется, когда все поля спецификации времени / даты соответствуют текущему времени и дате, есть одно исключение: если и «день месяца» (поле 3), и «день недели» (поле 5) ограничены ( не "*"), то один или оба должны соответствовать текущему дню.

Например, следующее очищает журнал ошибок Apache через одну минуту после полуночи (00:01) каждый день, предполагая, что оболочка по умолчанию для пользователя cron совместима с оболочкой Bourne :

1 0 * * * printf "" > /var/log/apache/error_log

В этом примере каждую субботу в 23:45 (23:45) запускается программа оболочки с именем export_dump.sh.

45 23 * * 6 /home/oracle/scripts/export_dump.sh

Примечание. Также можно указать */nзапуск для каждого n-го интервала времени. Кроме того, можно указать несколько конкретных временных интервалов с помощью запятых (например, 1,2,3). Ниже показано, как выводить "hello world" в командную строку каждую 5-ю минуту каждого первого, второго и третьего часа (т.е. 01:00, 01:05, 01:10, до 03:55).

*/5 1,2,3 * * * echo hello world

Файл конфигурации для пользователя можно редактировать путем вызова crontab -eнезависимо от того, где фактическая реализация хранит этот файл.

Некоторые cronреализации, такие как популярная 4-я редакция BSD, написанная Полом Викси и включенная во многие дистрибутивы Linux, добавляют шестое поле: имя пользователя учетной записи, которое запускает указанное задание (при условии наличия пользователя и разрешений). Это разрешено только в системных таблицах crontab, но не в других, каждая из которых назначается для настройки одному пользователю. В качестве альтернативы шестое поле иногда используется для года вместо имени пользователя учетной записи - это делает демон nncron для Windows.

Реализация cron в Amazon EventBridge не использует день недели с отсчетом от 0, вместо этого используется 1-7 SUN-SAT (вместо 0-6), а также поддерживает дополнительные функции выражений, такие как first-weekday и last-day-of -месяц.

Нестандартные предопределенные определения расписания

Некоторые реализации cron поддерживают следующие нестандартные макросы:

Вход Описание Эквивалентно
@yearly (or @annually) Выполняется один раз в год в полночь 1 января. 0 0 1 1 *
@monthly Запускать раз в месяц в полночь первого числа месяца. 0 0 1 * *
@weekly Запускайте один раз в неделю в полночь в воскресенье утром 0 0 * * 0
@daily (or @midnight) Запускайте один раз в день в полночь 0 0 * * *
@hourly Запускайте один раз в час в начале часа 0 * * * *
@reboot Запускаться при старте N / A

@rebootнастраивает задание на запуск один раз при запуске демона. Поскольку cron обычно никогда не перезапускается, это обычно соответствует загрузке машины. Такое поведение применяется в некоторых вариантах cron, например, в Debian , поэтому простой перезапуск демона не приводит к повторному запуску @rebootзаданий.

@rebootможет быть полезно, если есть необходимость запустить сервер или демон от имени конкретного пользователя, и у пользователя нет доступа к настройке init для запуска программы.

Cron разрешения

Эти два файла играют важную роль:

  • /etc/cron.allow - если этот файл существует, он должен содержать имя пользователя, чтобы этому пользователю было разрешено использовать задания cron.
  • /etc/cron.deny - Если файл cron.allow не существует, но файл /etc/cron.deny существует, то для использования заданий cron пользователи не должны быть указаны в файле /etc/cron.deny.

Обратите внимание: если ни один из этих файлов не существует, то, в зависимости от параметров конфигурации сайта, либо только суперпользователь может использовать задания cron, либо все пользователи могут использовать задания cron.

Обработка часовых поясов

Большинство реализаций cron просто интерпретируют записи crontab в настройках системного часового пояса, под которыми работает демон cron. Это может быть источником споров, если на большой многопользовательской машине есть пользователи в нескольких часовых поясах, особенно если часовой пояс системы по умолчанию включает потенциально сбивающее с толку летнее время . Таким образом, реализация cron может как особый случай распознавать строки формы «CRON_TZ = <часовой пояс>» в пользовательских crontab, интерпретируя последующие записи crontab относительно этого часового пояса.

История

Ранние версии

Cron в Версии 7 Unix был системной службой (позже названной демоном ), вызываемой, /etc/rcкогда операционная система перешла в многопользовательский режим. Его алгоритм был прост:

  1. Читать /usr/lib/crontab
  2. Определите, должны ли какие-либо команды выполняться в текущую дату и время, и если да, запустите их от имени суперпользователя root.
  3. Поспать одну минуту
  4. Повторите, начиная с шага 1.

Эта версия cron была базовой и надежной, но она также потребляла ресурсы, независимо от того, находила ли она какую-либо работу или нет. В ходе эксперимента, проведенного в Университете Пердью в конце 1970-х годов по расширению службы cron для всех 100 пользователей на VAX с разделением времени , было обнаружено, что это создает слишком большую нагрузку на систему.

Многопользовательская возможность

Следующая версия cron с выпуском Unix System V была создана для расширения возможностей cron для всех пользователей системы Unix, а не только для суперпользователя. Хотя сегодня это может показаться тривиальным, поскольку большинство Unix и Unix-подобных систем имеют мощные процессоры и небольшое количество пользователей, в то время требовался новый подход к системе с одним MIPS , имеющей примерно 100 учетных записей пользователей.

В августовском выпуске « Коммуникаций ACM» за 1977 г. В. Р. Франта и Курт Мали опубликовали статью под названием «Эффективная структура данных для набора событий моделирования», описывающую структуру данных очереди событий для систем моделирования, управляемых дискретными событиями, которые продемонстрировали: « производительность выше, чем у обычно используемых алгоритмов простых связанных списков », хорошее поведение при неравномерном распределении времени и сложность наихудшего случая , где« n »- количество событий в очереди.

Аспирант Purdue Роберт Браун, просматривая эту статью, обнаружил параллель между cron и симуляторами дискретных событий и создал реализацию диспетчера списков событий Franta – Maly (ELM) для экспериментов. Симуляторы дискретных событий работают в виртуальном времени , максимально быстро удаляя события из очереди событий и продвигая свое понятие «сейчас» к запланированному времени следующего события. Запуск симулятора событий в «реальном времени» вместо виртуального времени создал версию cron, которая большую часть своего времени проводила в спящем режиме, ожидая запланированного времени для выполнения задачи во главе списка событий.

В следующем учебном году в аспирантуру Purdue поступили новые студенты, в том числе Кейт Уильямсон, который присоединился к системному персоналу в отделе компьютерных наук. В качестве «разминки» Браун попросил его превратить прототип cron в производственную службу, и этот многопользовательский cron начал использоваться в Purdue в конце 1979 года. Эта версия cron полностью заменила ту, /etc/cronкоторая использовалась на компьютере. научный отдел VAX 11/780 работает 32 / V.

Алгоритм, используемый этой cron, выглядит следующим образом:

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

Кроме того, демон реагирует на сигналы SIGHUP для повторного сканирования измененных файлов crontab и планирует специальные «события пробуждения» на час и полчаса для поиска измененных файлов crontab. Здесь опущены многие детали, касающиеся неточностей компьютерного отслеживания времени суток, планирования аварийных сигналов Unix, явных изменений времени суток и управления процессами, которые составляют большую часть строк кода в этом cron. Этот cron также захватил вывод stdout и stderr и отправил любой вывод по электронной почте владельцу crontab.

Ресурсы, потребляемые этим cron, масштабируются только в зависимости от объема выполняемой работы и не увеличиваются со временем, за исключением периодической проверки изменений.

Уильямсон закончил учебу, ушел из университета со степенью магистра компьютерных наук и присоединился к AT&T Bell Labs в Мюррей-Хилле, штат Нью-Джерси, и взял с собой этот cron. В Bell Labs, он и другие включили Unix atкоманды в хроны, перемещать файлы CRONTAB из домашних каталогов пользователей (которые не были машино-зависимым) и в общую принимающем конкретной директорию золотника, и необходимости добавили crontabкоманду , чтобы разрешить пользователи должны скопировать свои crontab в этот буферный каталог.

Эта версия cron позже появилась практически без изменений в Unix System V, BSD и их производных, Solaris от Sun Microsystems , IRIX от Silicon Graphics , HP-UX от Hewlett-Packard и AIX от IBM . Технически исходная лицензия на эти реализации должна быть у Purdue Research Foundation, которая финансировала работу, но это произошло в то время, когда подобным вопросам уделялось мало внимания.

Современные версии

С появлением GNU Project и Linux появились новые кроны. Наиболее распространенным из них является Vixie cron, первоначально созданный Полом Викси в 1987 году. Версия 3 Vixie cron была выпущена в конце 1993 года. Версия 4.1 была переименована в ISC Cron и выпущена в январе 2004 года. Версия 3 с некоторыми незначительными исправлениями. , используется в большинстве дистрибутивов Linux и BSD.

В 2007 году Red Hat разделила vixie-cron 4.1 на проект cronie и включила anacron 2.3 в 2009 году.

Другие популярные реализации включают anacron и dcron. Однако anacron не является независимой программой cron. Это должно вызвать другое задание cron. dcron был создан основателем DragonFly BSD Мэттом Диллоном , а его сопровождение взял на себя Джим Прайор в 2010 году.

В 2003 году Дейл Меллор представил mcron, вариант cron, написанный на Guile, который обеспечивает перекрестную совместимость с Vixie cron, а также обеспечивает большую гибкость, поскольку позволяет использовать произвольный код схемы при планировании вычислений и определениях заданий. Поскольку и демон mcron, и файлы crontab обычно записываются по схеме (хотя mcron также принимает традиционные crontab от Vixie), совокупное состояние очереди заданий пользователя доступно для их кода задания, который может быть запланирован для запуска, если и только будут получены результаты других вакансии соответствуют определенным критериям. Mcron развертываются по умолчанию под Guix менеджера пакетов, который включает в себя положение ( услуги ) для менеджера пакетов в monadically Испустите mcron crontabs время как обеспечение того , чтобы все пакеты , необходимые для выполнения задания устанавливаются и соответствующие crontabs правильно обращаться к ним.

Решение webcron планирует регулярное выполнение кольцевых задач там, где реализации cron недоступны в среде веб-хостинга .

CRON выражение

Выражение CRON - это строка, состоящая из пяти или шести полей, разделенных пробелом, которые представляют набор раз, обычно как расписание для выполнения некоторой процедуры.

Комментарии начинаются со знака комментария # и должны находиться в отдельной строке.

Поле Необходимый Допустимые значения Разрешенные специальные символы Замечания
Минуты да 0–59 * , -
Часы да 0–23 * , -
День месяца да 1–31 * , - ? L W ? L W только в некоторых реализациях
Месяц да 1–12 или ЯНВ – ДЕКАБРЬ * , -
День недели да 0–6 или ВС – СБ * , - ? L # ? L # только в некоторых реализациях
Год Нет 1970–2099 * , - Это поле не поддерживается в стандартных реализациях и реализациях по умолчанию.

Аббревиатуры месяца и дня недели не чувствительны к регистру.

В конкретном случае системного файла crontab (/ etc / crontab) пользовательское поле вставляется перед командой . Обычно это «root».

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

Запятая ( ,)
Запятые используются для разделения элементов списка. Например, использование «ПН, СР, ПТ» в 5-м поле (день недели) означает понедельник, среду и пятницу.
Тире ( -)
Тире определяет диапазоны. Например, 2000–2010 означает каждый год с 2000 по 2010 год включительно.
Процент ( %)
Знаки процента (%) в команде, если они не экранированы обратной косой чертой (\), заменяются символами новой строки, и все данные после первого% отправляются команде как стандартный ввод.

Нестандартные персонажи

Следующие ниже символы являются нестандартными и существуют только в некоторых реализациях cron, например в планировщике Quartz Java .

L
«L» означает «последний». При использовании в поле дня недели он позволяет указывать такие конструкции, как «последняя пятница» (« 5L ») данного месяца. В поле дня месяца указывается последний день месяца.
W
В поле дня месяца допускается использование символа «W». Этот символ используется для указания дня недели (с понедельника по пятницу), ближайшего к данному дню. Например, если в качестве значения для поля дня месяца указано « 15W », это означает: «ближайший будний день до 15-го числа месяца». Итак, если 15-е число - суббота, триггер срабатывает в пятницу, 14-е. Если 15-е число - воскресенье, триггер срабатывает в понедельник, 16-е. Если 15-е число - вторник, то он срабатывает во вторник 15-го числа. Однако, если в качестве значения для дня месяца указано «1W», а 1-е - суббота, триггер срабатывает в понедельник 3-го числа, так как он не «перескакивает» границу дней месяца. Символ «W» можно указывать только в том случае, если день месяца - это один день, а не диапазон или список дней.
Хеш ( #)
Знак «#» разрешен для поля дня недели, после него должно быть указано число от одного до пяти. Он позволяет задавать такие конструкции, как «вторая пятница» данного месяца. Например, ввод «5 # 3» в поле дня недели соответствует третьей пятнице каждого месяца.
Знак вопроса ( ?)
В некоторых реализациях используется вместо " * ", чтобы оставить поле дня месяца или дня недели пустым. Другие реализации cron заменяют "?" со временем запуска демона cron, так что ? ? * * * *оно будет обновлено на, 25 8 * * * *если cron запустится в 8:25 утра, и будет запускаться в это время каждый день до следующего перезапуска.
Косая черта ( /)
В vixie-cron косые черты можно комбинировать с диапазонами для указания значений шага. Например, * / 5 в поле минут означает каждые 5 минут (см. Примечание ниже о частотах). Это сокращение от более подробной формы POSIX 5,10,15,20,25,30,35,40,45,50,55,00 . POSIX не определяет использование слэшей; его обоснование (комментарий к расширению BSD) отмечает, что определение основано на формате System V, но не исключает возможности расширений.

Обратите внимание, что частоты в целом не могут быть выражены; только значения шага, которые равномерно делят свой диапазон, выражают точные частоты (для минут и секунд это / 2, / 3, / 4, / 5, / 6, / 10, / 12, / 15, / 20 и / 30, потому что 60 - это делится на эти числа без остатка; для часов это / 2, / 3, / 4, / 6, / 8 и / 12 ); все другие возможные «шаги» и все другие поля дают несогласованные «короткие» периоды в конце единицы времени, прежде чем она «сбрасывается» на следующую минуту, секунду или день; например, ввод * / 5 в поле дня иногда выполняется через 1, 2 или 3 дня, в зависимости от месяца и високосного года; это связано с тем, что cron не имеет состояния (он не запоминает время последнего выполнения и не подсчитывает разницу между ним и текущим моментом, что требуется для точного подсчета частоты - вместо этого cron является простым средством сопоставления с образцом).

H
«H» используется в системе непрерывной интеграции Jenkins , чтобы указать, что подставляется «хешированное» значение. Таким образом, вместо фиксированного числа, такого как « 20 * * * *что означает через 20 минут после часа каждый час», H * * * *означает, что задача выполняется каждый час в неуказанное, но неизменное время для каждой задачи. Это позволяет распределять задачи по времени, а не запускать их все одновременно и бороться за ресурсы.

Смотрите также

использованная литература

внешние ссылки