Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

Обзор [ править ]

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

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

# ┌───────────── минут (0-59)# │ ┌───────────── час (0-23)# │ │ ┌───────────── день месяца (1-31)# │ │ │ ┌───────────── месяц (1 - 12)# │ │ │ │ ┌───────────── день недели (0-6) (с воскресенья по субботу;# │ │ │ │ │ 7 тоже воскресенье в некоторых системах)# │ │ │ │ │# │ │ │ │ │# * * * * * <команда для выполнения>

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

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

Например, следующее очищает журнал ошибок 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 * * * эхо привет, мир

Файл конфигурации для пользователя можно редактировать путем вызова 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 [ править ]

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

  • /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 относительно этого часового пояса. [11]

История [ править ]

Ранние версии [ править ]

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

  1. Читать /usr/lib/crontab[13]
  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 году его руководство перешло к Джиму Прайору [14].

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

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

CRON выражение [ править ]

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

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

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

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

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

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

Нестандартные символы [ править ]

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

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

Обратите внимание, что частоты в целом не могут быть выражены; только значения шага, которые равномерно делят свой диапазон, выражают точные частоты (для минут и секунд это / 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 * * * *означает, что задача выполняется каждый час в неуказанное, но неизменное время для каждой задачи. Это позволяет распределять задачи по времени, вместо того, чтобы запускать их все одновременно и конкурировать за ресурсы. [22]

См. Также [ править ]

  • в (команда)
  • Launchd
  • Список команд Unix
  • Планирование (вычисление)
  • systemd - включает эквивалент cron (так называемые таймеры )
  • fcron
  • Планировщик задач Windows

Ссылки [ править ]

  1. ^ "Разница между cron, crontab и cronjob?" . Переполнение стека .
  2. ^ «Работа Cron: полное руководство для начинающих 2020» . 24 мая 2019.
  3. ^ "Автоматизация с помощью Cron на Centos 8" . 6 апреля 2020.
  4. ^ «Crontab - Краткий справочник» . Выбор админа . 21 декабря 2009 г.
  5. ^ «Введение в cron для новичков» . Unixgeeks.org . Проверено 6 ноября 2013 .
  6. ^ "Ответ Ка Сенг Тай на вопрос Какова этимология слова" cron "?" . quora.com. 2019-03-08.
  7. ^ a b «crontab» , выпуск 7 базовых спецификаций Open Group - IEEE Std 1003.1, издание 2013 г. , The Open Group, 2013 г. , получено 18 мая 2015 г.
  8. ^ «Выражения расписания для правил» . Amazon.
  9. ^ a b "Руководство по форматам файлов FreeBSD для CRONTAB (5)" . Проект FreeBSD.
  10. ^ "# 77563 - cron: crontab (5) ложь, '@reboot' - всякий раз, когда cron перезагружается, а не система" . Система отслеживания ошибок Debian . Проверено 6 ноября 2013 .
  11. ^ "crontab (5): таблицы для управления cron - страница руководства Linux" . Linux.die.net . Проверено 6 ноября 2013 .
  12. ^ Домашняя страница Минни http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/etc/rc . Проверено 12 сентября 2020 . Отсутствует или пусто |title=( справка )
  13. ^ Домашняя страница Минни http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/cron.c . Проверено 12 сентября 2020 . Отсутствует или пусто |title=( справка )
  14. ^ Прайор, Джим (2010-01-05). «Крон» . [email protected] (список рассылки) . Проверено 6 ноября 2013 .
  15. ^ Меллор, Дейл (2003-06-01). «Макрон - Требования пользователей и анализ» . Проверено 11 июня 2019 .
  16. ^ «Справочное руководство GNU Guix: 8.8.2 Выполнение заданий по расписанию» . GNU Guix. 2019-05-19 . Проверено 11 июня 2019 .
  17. ^ "Ubuntu Cron Howto" . Help.ubuntu.com. 2013-05-04 . Проверено 6 ноября 2013 .
  18. ^ "Учебное пособие по CronTrigger" . Веб-сайт Quartz Scheduler . Архивировано из оригинального 25 октября 2011 года . Проверено 24 октября 2011 года .
  19. ^ "Ссылка на mcron crontab" . Gnu.org . Проверено 6 ноября 2013 .
  20. ^ «Руководство по интеграции Oracle® Role Manager» . Docs.oracle.com . Проверено 6 ноября 2013 .
  21. ^ "Формат Cron" . nnBackup . Проверено 27 мая 2014 .
  22. ^ "Синтаксис триггера таймера" . jenkins.com . Проверено 16 февраля 2018 .

Внешние ссылки [ править ]

  • crontab: запланировать периодическую фоновую работу - Справочник по командам и служебным программам, спецификация Single UNIX , выпуск 7 от Open Group
  • GNU cron (mcron)
  • ISC Cron 4.1
  • приятель
  • Цифровая библиотека ACM - Франта, Малый, «Эффективная структура данных для набора событий моделирования» (требуется подписка на пабы ACM)
  • Учебник по синтаксису Crontab - объяснение синтаксиса Crontab
  • UNIX / Linux cron tutorial - краткое руководство для UNIX-подобных операционных систем с примерами сценариев оболочки.