cron - cron

редактировать
Планировщик заданий на основе времени для Unix-подобных операционных систем
cron
Разработчик (и) ATT Bell Laboratories
Первый выпускмай 1975 г.; 45 лет назад (1975-05)
Написано наC
Операционной системе Linux, macOS, FreeBSD
Platform Cross-Platform
Введите Команда

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

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

Содержание

  • 1 Обзор
    • 1.1 Нестандартные предопределенные определения расписания
    • 1.2 Разрешения Cron
    • 1.3 Обработка часовых поясов
  • 2 История
    • 2.1 Ранние версии
    • 2.2 Многопользовательская возможности
    • 2.3 Современные версии
  • 3 CRON-выражение
    • 3.1 Нестандартные символы
  • 4 См. также
  • 5 Ссылки
  • 6 Внешние ссылки

Обзор

Действия 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

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

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

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

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

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

History

Early версии

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 учетных записей пользователей.

В августовском выпуске журнала Communications of the ACM за 1977 год, В. Р. Франта и Курт Мали опубликовали статью под названием «Эффективная структура данных для набора событий моделирования», описывающая очередь событий структура данных для дискретных систем моделирования, управляемых событиями, которые продемонстрировали «производительность выше, чем у обычно используемых алгоритмов простых связанных списков», хорошее поведение при неравномерном распределении времени и наихудший случай сложность O (n) {\ displaystyle O \ left ({\ sqrt {n}} \ right)}O \ left (\ sqrt {n} \ right) , где «n» - количество событий в очереди.

аспирант Purdue Роберт Браун, просматривая эту статью, обнаружил параллель между cron и симуляторами дискретных событий и создал реализацию диспетчера списков событий Франта – Малый (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. Определить следующий раз в future, чтобы запустить эту команду и снова поместить ее в список событий в это время.

Кроме того, демон реагирует на сигналы 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

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

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

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

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

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

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

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

Нестандартные символы

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

L
'L' означает "последний". При использовании в поле дня недели он позволяет указать конструкции, такие как "последняя пятница" ("5L") данного месяца. В поле день-месяца он указывает последний день месяца.
W
Символ 'W' разрешен для дня- поля месяца. Этот символ r используется для указания дня недели (понедельник-пятница), ближайшего к данному дню. Например, если «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 минут (см. примечание ниже о частотах). Это сокращение от глагола more ose POSIX form 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 * * * *» указывает, что задача выполняется каждый час в неуказанное, но неизменное время для каждой задачи. Это позволяет распределять задачи по времени, а не запускать все одновременно и конкурировать за ресурсы.

См. Также

Ссылки

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

Руководство по Wikibook в Unix есть страница по теме: Команды
Последняя правка сделана 2021-05-16 09:28:55
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте