Утилита cron
командной строки — это планировщик заданий в операционных системах типа Unix . Пользователи, которые настраивают и поддерживают программные среды, используют cron для планирования заданий [1] (команд или сценариев оболочки ), также известных как задания cron [2] [ 3], для периодического запуска в фиксированное время, дату или интервал. [4] Обычно он автоматизирует обслуживание или администрирование системы, хотя его общая природа делает его полезным для таких вещей, как загрузка файлов из Интернета и загрузка электронной почты через регулярные интервалы. [5]
Cron лучше всего подходит для планирования повторяющихся задач. Планирование одноразовых задач можно выполнить с помощью соответствующей утилиты at .
Имя Крон происходит от греческого слова Chronos , означающего время. [6] [ необходим лучший источник ]
Действия cron управляются файлом crontab (таблица cron), файлом конфигурации, который определяет команды оболочки для периодического запуска по заданному расписанию. Файлы crontab хранятся там, где хранятся списки заданий и другие инструкции для демона cron . Пользователи могут иметь свои собственные файлы crontab, и часто существует общесистемный файл crontab (обычно в /etc
или в подкаталоге /etc
eg /etc/cron.d
), который могут редактировать только системные администраторы. [примечание 1]
Каждая строка файла crontab представляет собой задание и выглядит следующим образом:
# * * * * * <команда для выполнения> # | | | | | # | | | | день недели (0–6) (с воскресенья по субботу; # | | | месяц (1–12) 7 также является воскресеньем в некоторых системах) # | | день месяца (1–31) # | час (0–23) # минута (0–59)
Синтаксис каждой строки предполагает выражение cron, состоящее из пяти полей, представляющих время выполнения команды, за которым следует команда оболочки для выполнения.
Хотя обычно задание выполняется, когда все поля спецификации времени/даты соответствуют текущему времени и дате, есть одно исключение: если оба поля «день месяца» (поле 3) и «день недели» (поле 5) ограничены (не содержат «*»), то одно или оба поля должны соответствовать текущему дню. [7]
Например, следующая команда очищает журнал ошибок Apache через одну минуту после полуночи (00:01) каждый день, предполагая, что оболочка по умолчанию для пользователя cron совместима с оболочкой Bourne :
1 0 * * * printf "" > /var/log/apache/error_log
В этом примере запускается программа оболочки export_dump.sh в 23:45 (23:45) каждую субботу.
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 * * * эхо привет мир
Файл конфигурации для пользователя можно редактировать путем вызова crontab -e
независимо от того, где фактическая реализация хранит этот файл.
Некоторые cron
реализации, такие как популярное 4-е издание BSD, написанное Полом Викси и включенное во многие дистрибутивы Linux, добавляют шестое поле: имя пользователя учетной записи, которая запускает указанное задание (в зависимости от существования пользователя и разрешений). Это разрешено только в системных crontab-ах — не в других, которые назначаются каждому пользователю для настройки. Шестое поле иногда используется для года вместо имени пользователя учетной записи — это делает демон nncron для Windows.
Реализация cron в Amazon EventBridge не использует 0 в качестве дня недели, вместо этого используется 1-7 SUN-SAT (вместо 0-6), а также поддерживает дополнительные функции выражений, такие как первый день недели и последний день месяца. [8]
Некоторые реализации cron [9] поддерживают следующие нестандартные макросы:
@reboot
настраивает задание на однократный запуск при запуске демона. Поскольку cron обычно никогда не перезапускается, это обычно соответствует загрузке машины. Такое поведение принудительно применяется в некоторых вариациях cron, например, в Debian [ 10], так что простой перезапуск демона не приводит к повторному запуску @reboot
заданий.
@reboot
может быть полезно, если необходимо запустить сервер или демон под определенным пользователем, а у пользователя нет доступа к настройке init для запуска программы.
Эти два файла играют важную роль:
Обратите внимание, что если ни один из этих файлов не существует, то в зависимости от параметров конфигурации, зависящих от сайта, либо только суперпользователь может использовать задания cron, либо все пользователи могут использовать задания cron.
Большинство реализаций cron просто интерпретируют записи crontab в настройках системного часового пояса, в котором работает демон cron. Это может стать источником спора, если на большой многопользовательской машине пользователи находятся в нескольких часовых поясах, особенно если системный часовой пояс по умолчанию включает потенциально запутывающий DST . Таким образом, реализация cron может в качестве особого случая распознавать строки формы "CRON_TZ=<часовой пояс>" в пользовательских crontab, интерпретируя последующие записи crontab относительно этого часового пояса. [11]
Cron в версии 7 Unix был системной службой (позже названной демоном ), вызываемой /etc/rc
при переходе операционной системы в многопользовательский режим. [12] Его алгоритм был прост:
/usr/lib/crontab
[13]Эта версия cron была базовой и надежной, но она также потребляла ресурсы независимо от того, находила ли она какую-либо работу или нет. В эксперименте в Университете Пердью в конце 1970-х годов по расширению службы cron на всех 100 пользователей на разделенном по времени VAX было обнаружено, что это создает слишком большую нагрузку на систему.
Следующая версия cron, с выпуском Unix System V , была создана для расширения возможностей cron для всех пользователей системы Unix, а не только для суперпользователя. Хотя сегодня это может показаться тривиальным, учитывая, что большинство систем Unix и Unix-подобных систем имеют мощные процессоры и небольшое количество пользователей, в то время это требовало нового подхода на системе с одним MIPS , имеющей примерно 100 учетных записей пользователей.
В августовском выпуске журнала Communications of the ACM за 1977 год В. Р. Франта и Курт Мали опубликовали статью под названием «Эффективная структура данных для набора событий моделирования», в которой описывалась структура данных очереди событий для дискретных систем моделирования, управляемых событиями, которая продемонстрировала «производительность, превосходящую производительность обычно используемых простых алгоритмов связанных списков», хорошее поведение при неравномерном распределении времени и сложность в наихудшем случае , где «n» — число событий в очереди.
Аспирант Пердью Роберт Браун, просматривая эту статью, распознал параллель между cron и дискретными симуляторами событий и создал реализацию менеджера списка событий Франта–Мали (ELM) для экспериментов. Дискретные симуляторы событий работают в виртуальном времени , максимально быстро извлекая события из очереди событий и продвигая свое понятие «сейчас» к запланированному времени следующего события. Запуск симулятора событий в «реальном времени» вместо виртуального времени создал версию cron, которая большую часть времени проводила в спящем режиме, ожидая запланированного времени для выполнения задачи во главе списка событий.
Следующий учебный год привел новых студентов в аспирантуру в Purdue, включая Кейта Уильямсона, который присоединился к системному персоналу на кафедре компьютерных наук. В качестве «разминочного задания» Браун попросил его превратить прототип cron в производственную службу, и этот многопользовательский cron начал использоваться в Purdue в конце 1979 года. Эта версия cron полностью заменила ту, /etc/cron
которая использовалась на VAX 11/780 кафедры компьютерных наук, работающей под управлением 32/V.
Алгоритм, используемый этим cron, следующий:
.crontab
в домашних каталогах всех владельцев учетных записей.Кроме того, демон отвечает на сигналы SIGHUP для повторного сканирования измененных файлов crontab и планирует специальные «события пробуждения» на час и полчаса для поиска измененных файлов crontab. Здесь опущены многие детали, касающиеся неточностей отслеживания времени суток компьютера, планирования будильников Unix, явных изменений времени суток и управления процессами, все из которых составляют большую часть строк кода в этом cron. Этот cron также захватывал вывод stdout и stderr и отправлял по электронной почте любой вывод владельцу crontab.
Ресурсы, потребляемые этим cron, масштабируются только в зависимости от объема предоставленной ему работы и по сути не увеличиваются со временем, за исключением периодической проверки на наличие изменений.
Уильямсон закончил учебу и покинул университет со степенью магистра наук в области компьютерных наук, присоединился к AT&T Bell Labs в Мюррей-Хилл, штат Нью-Джерси, и взял с собой этот cron. В Bell Labs он и другие включили команду Unixat
в cron, переместили файлы crontab из домашних каталогов пользователей (которые не были специфичны для хоста) в общий каталог спула, специфичный для хоста, и по необходимости добавили crontab
команду, позволяющую пользователям копировать свои crontab в этот каталог спула.
Эта версия cron позже появилась в значительной степени без изменений в Unix System V и в BSD и их производных, Solaris от Sun Microsystems , IRIX от Silicon Graphics , HP-UX от Hewlett-Packard и AIX от IBM . Технически, первоначальная лицензия на эти реализации должна была принадлежать Purdue Research Foundation, который финансировал работу, но это произошло в то время, когда мало кто беспокоился о таких вопросах.
С появлением проекта GNU и Linux появились новые cron. Наиболее распространённым из них является Vixie cron, изначально написанный Полом Викси в 1987 году. Версия 3 Vixie cron была выпущена в конце 1993 года. Версия 4.1 была переименована в ISC Cron и выпущена в январе 2004 года. Версия 3, с некоторыми незначительными исправлениями ошибок, используется в большинстве дистрибутивов Linux и BSD.
В 2007 году Red Hat отделила vixie-cron 4.1 от проекта cronie , добавив такие функции, как поддержка PAM и SELinux. [14] В 2009 году anacron 2.3 был объединен с cronie. [15] Однако Anacron не является независимой программой cron; ее должно вызывать другое задание cron.
Dcron компании DragonFly был создан ее основателем Мэттом Диллоном , а его поддержка была взята на себя Джимом Прайором в 2010 году. [16]
В 2003 году Дейл Меллор представил mcron, [17] вариант cron, написанный на Guile , который обеспечивает кросс-совместимость с Vixie cron, а также большую гибкость, поскольку позволяет использовать произвольный код схемы при планировании вычислений и определении заданий. Поскольку и демон mcron, и файлы crontab обычно пишутся на схеме (хотя mcron также принимает традиционные Vixie crontab), совокупное состояние очереди заданий пользователя доступно для его кода задания, который может быть запланирован для запуска , если результаты других заданий соответствуют определенным критериям. Mcron по умолчанию развертывается в менеджере пакетов Guix , который включает в себя положения ( службы ) для менеджера пакетов для монадической эмиссии mcron crontab, при этом гарантируя, что пакеты, необходимые для выполнения задания, установлены, и что соответствующие crontab правильно ссылаются на них. [18]
Решение WebCron планирует регулярный запуск кольцевых задач везде, где реализации Cron недоступны в среде веб-хостинга .
Выражение cron представляет собой строку, состоящую из пяти или шести полей, разделенных пробелом [19] , которая представляет собой набор времен, обычно в виде расписания для выполнения некоторой процедуры.
Комментарии начинаются со знака комментария # и должны располагаться на отдельной строке.
Сокращения месяцев и дней недели нечувствительны к регистру.
В частном случае системного файла crontab (/etc/crontab) пользовательское поле вставляется перед командой . Обычно оно установлено на «root».
В некоторых случаях использования формата cron в начале шаблона также есть поле секунд . В этом случае выражение cron представляет собой строку, состоящую из 6 или 7 полей. [20]
*
),
)-
)%
)Ниже приведены нестандартные символы, которые существуют только в некоторых реализациях cron, таких как планировщик Quartz Java .
L
W
#
)?
)? ? * * * *
25 8 * * * *
/
)Обратите внимание, что частоты в общем случае не могут быть выражены; только значения шагов, которые равномерно делят их диапазон, выражают точные частоты (для минут и секунд это /2, /3, /4, /5, /6, /10, /12, /15, /20 и /30, поскольку 60 делится на эти числа без остатка; для часов это /2, /3, /4, /6, /8 и /12 ); все другие возможные «шаги» и все другие поля выдают непоследовательные «короткие» периоды в конце единицы времени, прежде чем она «сбрасывается» на следующую минуту, секунду или день; например, ввод */5 для поля дня иногда выполняет через 1, 2 или 3 дня, в зависимости от месяца и високосного года; это происходит потому, что cron не сохраняет состояние (он не запоминает время последнего выполнения и не подсчитывает разницу между ним и текущим моментом, что требуется для точного подсчета частот — вместо этого cron является просто сопоставителем шаблонов).
Некоторые библиотеки, специфичные для языка, предлагающие возможность планирования crontab, не требуют «строгих» диапазонов 15-59/XX слева от косой черты, когда диапазоны используются. [24] В этих случаях 15/XX совпадает с расписанием vixie-cron 15-59/10 в разделе минут. Аналогично, вы можете удалить дополнительные -23 из 0-23/XX , -31 из 1-31/XX и -12 из 1-12/XX для часов, дней и месяцев соответственно.
H
20 * * * *
', которое означает 20 минут после часа каждый час, ' H * * * *
' указывает, что задача выполняется каждый час в неопределенное, но неизменное время для каждой задачи. Это позволяет распределять задачи во времени, а не запускать их все одновременно и конкурировать за ресурсы. [25]