stringtranslate.com

крон

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

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

Имя Крон происходит от греческого слова Chronos , означающего время. [6] [ необходим лучший источник ]

Обзор

Действия cron управляются файлом crontab (таблица cron), файлом конфигурации, который определяет команды оболочки для периодического запуска по заданному расписанию. Файлы crontab хранятся там, где хранятся списки заданий и другие инструкции для демона cron . Пользователи могут иметь свои собственные файлы crontab, и часто существует общесистемный файл crontab (обычно в /etcили в подкаталоге /etceg /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.

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

Большинство реализаций cron просто интерпретируют записи crontab в настройках системного часового пояса, в котором работает демон cron. Это может стать источником спора, если на большой многопользовательской машине пользователи находятся в нескольких часовых поясах, особенно если системный часовой пояс по умолчанию включает потенциально запутывающий DST . Таким образом, реализация 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 учетных записей пользователей.

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

Аспирант Пердью Роберт Браун, просматривая эту статью, распознал параллель между 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. Определите следующее время в будущем для выполнения этой команды и поместите ее обратно в список событий в это значение времени.

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

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

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

Сокращения месяцев и дней недели нечувствительны к регистру.

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

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

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


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

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

L
'L' означает "last". При использовании в поле дня недели позволяет указывать конструкции, такие как "последняя пятница" (" 5L ") указанного месяца. В поле дня месяца указывает последний день месяца.
W
Символ 'W' разрешен для поля дня месяца. Этот символ используется для указания дня недели (понедельник-пятница), ближайшего к заданному дню. Например, если в качестве значения поля дня месяца указано " 15W ", то значение будет: "ближайший день недели к 15-му числу месяца". Таким образом, если 15-е число приходится на субботу, триггер срабатывает в пятницу 14-го. Если 15-е число приходится на воскресенье, триггер срабатывает в понедельник 16-го. Если 15-е число приходится на вторник, то триггер срабатывает во вторник 15-го. Однако если в качестве значения дня месяца указано "1W", а 1-е число приходится на субботу, то триггер срабатывает в понедельник 3-го, так как он не "перепрыгивает" через границу дней месяца. Символ 'W' можно указать только в том случае, если день месяца представляет собой один день, а не диапазон или список дней.
Хэш ( #)
'#' допускается для поля дня недели и должно сопровождаться числом от одного до пяти. Это позволяет указывать конструкции, такие как «вторая пятница» данного месяца. [22] Например, ввод «5#3» в поле дня недели соответствует третьей пятнице каждого месяца.
Вопросительный знак ( ?)
В некоторых реализациях используется вместо ' * ' для того, чтобы оставить пустым день месяца или день недели. Другие реализации cron заменяют "?" на время запуска демона cron, так что это будет обновлено, если cron был запущен в 8:25 утра, и будет запускаться в это время каждый день до следующего перезапуска. [23]? ? * * * *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 является просто сопоставителем шаблонов).

Некоторые библиотеки, специфичные для языка, предлагающие возможность планирования 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
'H' используется в системе непрерывной интеграции Jenkins для указания на то, что заменяется "хешированное" значение. Таким образом, вместо фиксированного числа, такого как ' 20 * * * *', которое означает 20 минут после часа каждый час, ' H * * * *' указывает, что задача выполняется каждый час в неопределенное, но неизменное время для каждой задачи. Это позволяет распределять задачи по времени, а не запускать их все одновременно и конкурировать за ресурсы. [25]

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

Примечание

  1. ^ Это зависит от типа распространения.

Ссылки

  1. ^ "Автоматизация с помощью задания Cron на Centos 8". 6 апреля 2020 г.
  2. ^ "Разница между cron, crontab и cronjob?". Stack Overflow .
  3. ^ «Cron Job: полное руководство для начинающих 2020». 24 мая 2019 г.
  4. ^ "Crontab – Краткий справочник". Выбор администратора . 21 декабря 2009 г.
  5. ^ "Введение в cron для новичков". Unixgeeks.org . Получено 2013-11-06 .
  6. ^ "Linux - cron и crontab".
  7. ^ ab "crontab", The Open Group Base Specifications Issue 7 — IEEE Std 1003.1, издание 2013 г. , The Open Group, 2013 г. , получено 18 мая 2015 г.
  8. ^ «Выражения расписания для правил». Amazon.
  9. ^ ab "Руководство по форматам файлов FreeBSD для CRONTAB(5)". Проект FreeBSD.
  10. ^ "#77563 - cron: crontab(5) лжет, '@reboot' происходит всякий раз, когда cron перезапускается, а не система". Система отслеживания ошибок Debian . Получено 2013-11-06 .
  11. ^ "crontab(5): таблицы для управления cron - страница руководства Linux". Linux.die.net . Получено 2013-11-06 .
  12. ^ "V7/etc/rc". Домашняя страница Минни . Получено 2020-09-12 .
  13. ^ "V7/usr/src/cmd/cron.c". Домашняя страница Минни . Получено 2020-09-12 .
  14. ^ "cronie-crond/cronie". cronie-crond. 20 сентября 2024 г.
  15. ^ "Первоначальная загрузка anacron-2.3, которая должна быть оптимизирована для лучшего · cronie-crond/cronie@55f4057". GitHub .
  16. ^ Прайор, Джим (2010-01-05). "Cron". [email protected] (список рассылки) . Получено 2013-11-06 .
  17. ^ Меллор, Дейл (01.06.2003). "Mcron - Требования и анализ пользователей" . Получено 11.06.2019 .
  18. ^ "Справочное руководство GNU Guix: 8.8.2 Выполнение запланированных заданий". GNU Guix. 2019-05-19 . Получено 2019-06-11 .
  19. ^ "Ubuntu Cron Howto". Help.ubuntu.com. 2013-05-04 . Получено 2013-11-06 .
  20. ^ "CronTrigger Tutorial". Сайт Quartz Scheduler . Архивировано из оригинала 25 октября 2011 г. Получено 24 октября 2011 г.
  21. ^ "mcron crontab reference". Gnu.org . Получено 2013-11-06 .
  22. ^ "Руководство по интеграции Oracle® Role Manager". Docs.oracle.com . Получено 2013-11-06 .
  23. ^ "Формат Cron". nnBackup . Получено 2014-05-27 .
  24. ^ "Python Crontab". GitHub . Получено 2023-04-05 .
  25. ^ "Синтаксис триггера таймера". jenkins.com . Получено 2018-02-16 .

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