Разработчик (и) | ATT Bell Laboratories |
---|---|
Первый выпуск | май 1975 г.; 45 лет назад (1975-05) |
Написано на | C |
Операционной системе | Linux, macOS, FreeBSD |
Platform | Cross-Platform |
Введите | Команда |
Программная утилита cron, также известная как cron job, является временным планировщиком заданий в Unix-подобном компьютер операционные системы. Пользователи, которые настраивают и обслуживают программные среды, используют cron для планирования заданий (команд или сценариев оболочки ) для периодического выполнения в фиксированное время, в определенные даты или интервалы. Обычно он автоматизирует обслуживание или администрирование системы, хотя его универсальный характер делает его полезным для таких вещей, как загрузка файлов из Интернета и загрузка электронной почты через регулярные промежутки времени. Название cron происходит от греческого слова, обозначающего время, χρόνος (chronos ).
Cron лучше всего подходит для планирования повторяющихся задач. Планирование одноразовых задач может быть выполнено с помощью связанного в
Действия cron управляются файлом crontab (таблица cron), файлом конфигурации, который определяет команды оболочки, которые необходимо запускать периодически по заданному расписанию. Файлы crontab хранятся там, где списки заданий и другие инструкции для демона cron сохраняются. Пользователи могут иметь свои собственные индивидуальные файлы crontab, и часто имеется общесистемный файл crontab (обычно в / etc
или в подкаталоге историю / etc
), которую могут редактировать только системные администраторы.
Каждая строка файла crontab представляет задание и выглядит следующим образом:
# ┌────────────── минута (0-59) # │ ┌───────────── час (0-23) # │ │ ┌────────────── день месяца (1-31) # │ │ │ ┌───────────── месяц (1 - 12) # │ │ │ │ ┌────────────── день недели (0-6) (воскресенье до субботы; # │ │ │ │ │ 7 также является воскресенье в некоторых системах) # │ │ │ │ │ # │ │ │ │ # * * * * *
Синтаксис каждой строки предполагает выражение cron, состоящее из пяти поля, которые представляют время для выполнения команды, за которым следует команда оболочки для выполнения.
Хотя обычно задание выполняется, когда все поля спецификации времени / даты соответствуют текущему времени и дате, есть одно исключение: если и «день месяца» (поле 3), и «день недели» ( поле 5) ограничены (не "*"), то один или оба должны соответствовать текущему дню.
Например, следующее очищает журнал ошибок 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 минут каждого первого, второго и третьего часа, так что (0100, 0105,.., 0355).
* / 5 1,2,3 * * * echo hello world
Файл конфигурации для пользователя можно отредактировать, вызвав crontab -e
, независимо от того, где фактическая реализация хранит этот файл.
Некоторые реализации cron
, такие как популярная 4-я редакция BSD, написанная Полом Викси и включенная во многие дистрибутивы Linux, добавляют шестое поле : имя пользователя учетной записи, которая запускает указанное задание (в зависимости от наличия пользователя и прав). Это разрешено только в системных crontab, но не в других, каждая из которых назначается для настройки одному пользователю. В качестве альтернативы шестое поле иногда используется для года вместо имени пользователя учетной записи - это делает демон для Windows.
Некоторые реализации cron поддерживают следующие нестандартные макросы:
Запись | Описание | Эквивалент |
---|---|---|
@ ежегодно (или @annually) | Выполняется один раз в год в полночь 1 января | 0 0 1 1 * |
@monthly | Выполняется один раз в месяц в полночь первого дня месяца | 0 0 1 * * |
@weekly | Запускать один раз в неделю в полночь в воскресенье утром | 0 0 * * 0 |
@daily (или @midnight) | Запускать один раз в день в полночь | 0 0 * * * |
@hourly | Запускать один раз в час в начале часа | 0 * * * * |
@reboot | Запускать при запуске | Н / Д |
@reboot
настраивает задание на запуск один раз при запуске демона. Поскольку cron обычно никогда не перезапускается, это обычно соответствует загрузке машины. Такое поведение применяется в некоторых вариантах cron, например, в Debian, так что простой перезапуск демона не приводит к повторному запуску заданий @reboot
.
@reboot
может быть полезен, если есть необходимость запустить сервер или демон от имени конкретного пользователя, и у пользователя нет доступа к настройке init для запуска программы.
Эти два файла играют важную роль:
Обратите внимание, что если ни один из этих файлов не существует, то, в зависимости от параметров конфигурации, зависящих от сайта, либо только суперпользователь может использовать задания cron, либо все пользователи могут использовать задания cron.
Большинство реализаций cron просто интерпретируют записи crontab в настройках системного часового пояса, под которыми работает демон cron. Это может быть источником споров, если на большой многопользовательской машине есть пользователи в нескольких часовых поясах, особенно если часовой пояс системы по умолчанию включает потенциально сбивающий с толку DST. Таким образом, реализация cron может как особый случай распознавать строки формы "CRON_TZ =
cron в версии 7 Unix был системной службой (позже названной демоном ), вызываемой из / etc / rc
при работе система перешла в многопользовательский режим. Его алгоритм был прост:
/ usr / lib / crontab
Эта версия cron была базовой и надежной, но она также потребляла ресурсы, если обнаружила какую-либо работу делать или нет. В ходе эксперимента, проведенного в Университете Пердью в конце 1970-х годов, по расширению службы cron для всех 100 пользователей на разделяемом по времени VAX, было обнаружено, что это создает слишком большую нагрузку на систему.
Следующая версия cron, с выпуском Unix System V, была создана для расширения возможностей cron для всех пользователей Unix. система, а не только суперпользователь. Хотя сегодня это может показаться тривиальным, поскольку большинство Unix и Unix-подобных систем имеют мощные процессоры и небольшое количество пользователей, в то время требовался новый подход к системе с одним MIPS, имеющей примерно 100 учетных записей пользователей.
В августовском выпуске журнала Communications of the ACM за 1977 год, В. Р. Франта и Курт Мали опубликовали статью под названием «Эффективная структура данных для набора событий моделирования», описывающая очередь событий структура данных для дискретных систем моделирования, управляемых событиями, которые продемонстрировали «производительность выше, чем у обычно используемых алгоритмов простых связанных списков», хорошее поведение при неравномерном распределении времени и наихудший случай сложность , где «n» - количество событий в очереди.
аспирант Purdue Роберт Браун, просматривая эту статью, обнаружил параллель между 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, масштабируются только в соответствии с объемом выполняемой работы и не увеличиваются со временем, за исключением периодической проверки изменений.
Уильямсон закончил учебу и покинул университет со степенью магистра компьютерных наук и присоединился к ATT Bell Labs в Мюррей-Хилле, штат Нью-Джерси, и взял с собой этот cron. В Bell Labs он и другие внедрили команду Unix at
в 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 Project и Linux появились новые кроны. Наиболее распространенным из них является Vixie cron, первоначально кодированный Полом Викси в 1987 году. Версия 3 Vixie cron была выпущена в конце 1993 года. Версия 4.1 была переименована в ISC Cron и был выпущен в январе 2004 года. Версия 3 с некоторыми незначительными исправлениями используется в большинстве дистрибутивов Linux и BSD.
В 2007 году Red Hat разделила проект vixie-cron 4.1 и включила 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, который включает в себя условия (services ) для менеджера пакетов для монадического испускания crontab mcron, обеспечивая при этом необходимость пакетов для выполнения заданий установлены и что соответствующие crontab правильно ссылаются на них.
A решение webcron планирует регулярное выполнение кольцевых задач везде, где реализации cron недоступны в среде веб-хостинга.
Выражение CRON - это строка, состоящая из пяти или шести полей, разделенных пробелом, которые представляют набор времени, обычно как расписание для выполнения некоторой процедуры.
Комментарии начинаются со знака комментария # и должны находиться в отдельной строке.
Поле | Обязательное | Разрешенные значения | Разрешенные специальные символы | Примечания |
---|---|---|---|---|
Минуты | Да | 0-59 | * , - | |
Часы | Да | 0-23 | * , - | |
День месяца | Да | 1-31 | * , - ? L W | ? L W только в некоторых реализациях |
Месяц | Да | 1-12 или ЯНВАРЬ-ДЕКАБРЬ | * , - | |
День недели | Да | 0-6 или SUN-SAT | * , - ? L # | ? L # только в некоторых реализациях |
Год | Нет | 1970-2099 | * , - | Это поле не поддерживается в стандартных реализациях / реализациях по умолчанию. |
Аббревиатуры месяца и дня недели не чувствительны к регистру.
В конкретном случае системного файла crontab (/ etc / crontab) пользовательское поле вставляется перед командой. Обычно это «root».
В некоторых случаях использования формата CRON в начале шаблона также есть поле секунд. В этом случае выражение CRON представляет собой строку, содержащую 6 или 7 полей.
,
)-
)%
)Следующие ниже символы являются нестандартными и существуют только в некоторых реализациях cron, таких как Quartz Java scheduler.
L
W
#
)?
)?? * * * *
будет обновлен до 25 8 * * * *
, если cron запустится в 8:25, и будет запускаться в это время каждый день, пока не будет перезапущен снова./
)Обратите внимание, что частоты в целом не могут быть выражены; только значения шага, которые равномерно делят свой диапазон, выражают точные частоты (для минут и секунд это / 2, / 3, / 4, / 5, / 6, / 10, / 12, / 15, / 20 и / 30, потому что 60 делится на эти числа без остатка; для часов это / 2, / 3, / 4, / 6, / 8 и / 12); все другие возможные «шаги» и все другие поля дают несогласованные «короткие» периоды в конце единицы времени, прежде чем она «сбрасывается» на следующую минуту, секунду или день; например, ввод * / 5 в поле дня иногда выполняется через 1, 2 или 3 дня, в зависимости от месяца и високосного года; это связано с тем, что cron не имеет состояния (он не запоминает время последнего выполнения и не подсчитывает разницу между ним и текущим моментом, что требуется для точного подсчета частоты - вместо этого cron является простым средством сопоставления с образцом).
H
20 * * * *
», что означает через 20 минут после часа каждый час, «H * * * *
» указывает, что задача выполняется каждый час в неуказанное, но неизменное время для каждой задачи. Это позволяет распределять задачи по времени, а не запускать все одновременно и конкурировать за ресурсы.Руководство по Wikibook в Unix есть страница по теме: Команды |
crontab
: планирование периодической фоновой работы - Справочник по командам и утилитам, Единая спецификация UNIX, Выпуск 7 из The Open Group