Демон "cron" - это встроенное приложение Linux, которое пользователи Linux используют для планирования выполнения процессов. Cron ищет в "cron tables" или "crontab" определенные файлы и скрипты. Файл crontab содержит набор команд, которые вы можете выполнять регулярно. Он также предоставляет имена команд, которые используются для управления списком команд. Crontab также использует планировщик cronjob для выполнения операций. Согласно набору инструкций, Cron - это системная функция, которая будет делать или выполнять процессы за вас. Crontab - это название расписания, а также утилиты, которая используется для этих изменений.
История
Когда операционная система включила многопользовательский режим для своих пользователей, из "/etc/rc" была вызвана системная служба cron. Алгоритм ее работы состоит из следующих шагов:
- Прочитать каталог "/usr/lib/crontab".
- Проверить, выполняются ли команды в текущее время и дату, затем выполнить команды от имени суперпользователя root.
- Подождать одну минуту.
- Повторите шаг 1 с самого начала.
Эта версия cron была надежной и простой, но она использовала ресурсы независимо от того, была ли у нее какая-либо работа. Во время эксперимента, проведенного в конце 1970-х годов в университете Пердью, было обнаружено, что разделенный по времени VAX, распространяющий службу cron на все 100 пользователей, оказывает слишком большую нагрузку на систему.
Современные версии Cron
Новые cron появились с появлением Linux и проекта GNU. Vixie cron", созданный Полом Викси в 1987 году, является самым распространенным. Vixie cron версии 3 был представлен в последнем квартале 1993 года. В январе 2004 года ISC Cron был переименован в версию 4.1. Большинство дистрибутивов BSD и Linux используют версию 3, в которой исправлено несколько мелких ошибок. В 2007 году Red Hat отделила Vixie-cron 4.1, а в 2009 году был добавлен anacron 2.3. Anacron и dcron - две другие известные реализации. Anacron не является самостоятельной программой cron. Она должна быть вызвана другим cronjob. Мэтт Диллон, основатель DragonFly BSD, создал dcron, а Джим Прайор взял на себя его обслуживание в 2010 году.
Дейл Меллор создал mcron, версию cron на основе Guile, совместимую с Vixie cron, в 2003 году. Она также обеспечивает большую гибкость, включая любой код схемы в описания задач и вычисления расписания. Mcron устанавливается по умолчанию под управлением пакетов Guix. Он также гарантирует, что необходимые пакеты установлены и что соответствующие кронтабы правильно ссылаются на них. Если реализация cron недоступна в среде веб-хостинга, решение webcron устанавливает кольцевые задачи для регулярного выполнения.
Что такое Cronjob?
Cron - это инструмент, который позволяет планировать задания для последующего выполнения. Вы можете использовать другую команду, если хотите запланировать одноразовую работу на более поздний срок. В то же время, cron идеально подходит для повторяющихся задач.
Вы можете быть знакомы с фоновыми процессами в Windows, такими как Службы. Cron - это демон, который выполняет свои функции, выполняя задания в фоновом режиме. В состоянии простоя демон ожидает выполнения задачи либо от рабочей системы, либо от другой системы на базе Linux, присутствующей в сети. Говоря о структуре файла cron, мы имеем файл cron, простой текстовый файл, содержащий команды, которые будут выполняться в запланированное время. "/etc/crontab" - это системный crontab-файл по умолчанию, который существует в следующем каталоге crontab: "/etc/cron.*/". Системные администраторы могут изменять системный файл crontab.
Операционные системы на базе Linux поддерживают множество пользователей. Каждый из них может создать свой файл crontab и добавить команды для выполнения задач, когда он пожелает. Демон cron будет проверять файл crontab, а затем выполнять задание в фоновом режиме. Вы также можете использовать cronjobs для создания резервных копий, контроля дискового пространства и автоматизации обслуживания системы. Задания Cron идеально подходят для машины, которая работает семь дней в неделю, 24 часа в сутки. Хотя системные администраторы в основном используют задания cron, они также могут быть чрезвычайно полезны для веб-разработчиков.
Зачем использовать Cronjob?
- Cronjobs помогает архивировать таблицы базы данных.
- Удаляют все файлы журналов, которые старше года.
- Отправка уведомлений по электронной почте, например, уведомлений об истечении срока действия пароля и информационных бюллетеней.
- Помогает операционной системе делать запланированное резервное копирование баз данных и файлов журналов.
- Регулярно очищает кэшированные данные.
- Используется для автоматизации обслуживания системы.
- Это огромный инструмент, используемый для автоматизации задач Unix.
Элементы Cronjob
Большинство cronjobs состоит из трех частей:
- Команда, которая используется для запуска скрипта.
- Сценарий, который будет выполнен.
- Результат выполнения скрипта.
Большинство программ, в которых требуется использование cronjob, предоставляют подробные инструкции по его настройке.
Файл Crontab
Строка файла crontab может быть либо "неактивной", либо "активной". Активная" строка - это запись команды cron или параметр окружения. Любая строка, которая игнорируется, включая комментарии, считается "неактивной". Табуляция, пробелы и пустые строки не учитываются. Строки со знаком "#" в качестве первого непробельного символа считаются комментариями и игнорируются. В настройках переменных окружения или командах cron не допускается существование команд на одних и тех же строках, поскольку если вы это сделаете, комментарии станут частью команды cron.
Работа с кронтабами
Кронтабы можно найти в локальном каталоге, например, в "/var/spool" или "/var/spool/cron/crontabs", который является его подкаталогом. Даже если они присутствуют в любом из этих мест, используйте команду crontab, чтобы выполнить задачу по их редактированию. Разберемся, какие компоненты необходимы, прежде чем вы сможете ожидать желаемых результатов от действий crontab. Запись в crontab должна присутствовать в первой команде. Пять параметров указывают время ее выполнения и то, должна ли она быть выполнена или нет. Кронтаб можно редактировать, предварительно войдя в режим редактирования командой
1 | crontab -e |
После того, как вы указали время в качестве входного параметра, crontab будет готов к запуску в указанное время.
Демон cron помогает выполнить необходимые проверки, чтобы команда crontab могла быть выполнена в указанное время. Каждую минуту демон crontab проверяет crontab. В результате кронтаб содержит информацию с точностью до минуты. После проверки выполняется соответствующая команда, при этом поля в crontab соответствуют текущему времени.
Следует избегать таких ситуаций, как "пропущенные часы" во время перехода на летнее время, поскольку команда может даже не выполниться ни разу. С другой стороны, если время встречается более одного раза, команда может выполняться даже дважды. Другой пример: дефис "-" может выполнять cronjob несколько раз в течение дня. Например, если кто-то хочет выполнить cronjob в 10-й и 11-й час дня, можно использовать команду 10-11. Другим важным аспектом выполнения cronjobs являются настройки разрешения на выполнение заданий. Разрешить или запретить пользователю выполнять cronjobs можно, внеся некоторые изменения в файлы cron.allow или cron.deny.
Использование Crontab
В системный пакет Linux включен "crontab" для планирования заданий. Соответственно, выполнение сценария от имени root облегчает обслуживание обновлений системы. Это так же просто, как изменить cronjob и, после этого, дождаться процесса перезапуска.
Синтаксис Crontab:
Синтаксис Crontab состоит из шести полей, в которых первые пять полей связаны с датой и временем выполнения. Каждое поле в файле crontab существует в следующем порядке:
1 | минута(ы) час(ы) день(ы) месяц(ы) будний день(ы) команда(ы) |
- минута: Его значение лежит в диапазоне 0-59. Параметр minute определяет точную минуту выполнения команды crontab.
- час: Его значение находится в диапазоне 0-23. Параметр hour определяет день выполнения команды crontab.
- день: Его значение находится в диапазоне 1-31. Параметр day определяет день, в который выполняется команда crontab.
- месяц: Его значение лежит в диапазоне 1-12 или JAN-DEC. Параметр month определяет месяц года, в котором выполняется команда crontab.
- будний день: Его значение находится в диапазоне 0-6 или SUN-SAT. Параметр weekday определяет день недели, в который выполняется команда crontab.
- комманда: Опция комманды устанавливает последовательность команд, которые будут выполняться.
Специальные символы в выражении
- "?" используется для обозначения слова "любой" в следующих полях: <день недели> и <день месяца> для обозначения любого произвольного значения и игнорирует значение поля. Например, мы можем ввести "?" в параметр <день недели>, чтобы запустить скрипт "7 числа каждого месяца", независимо от того, в какой день недели наступает этот день.
- "*" используется для указания всех или того, что событие должно произойти за единицу времени. Например, в поле <минута> "*" означает для каждой минуты.
- "-" обозначает "диапазон". Например, когда мы используем "-" между часами 9-12, это означает "9-й, 10-й, 11-й и 12-й часы".
Инкрементные значения указываются с помощью символа инкремента "/". Например, в поле минут "10/10" означает "10, 20, 30, 40 и 50 минут часа". - "," или "Запятая" обеспечивает диапазон значений. Например, "TUES, THUR, SAT" означает "TUESDAY, THURSDAY, SATURDAY".
- При использовании в различных областях буква "L" (last) имеет различные значения. В соответствии с календарным месяцем, если она используется в поле <день месяца> как "31 марта", это означает последний день марта. Использование вместе с ним значения смещения, например, "L-2", означает предпоследний день месяца.
- Ближайший день недели (с понедельника по пятницу) к данному дню месяца определяется буквой "W" (weekday). Если в поле <день месяца> записать "4W", это будет означать "день недели, ближайший к 4 числу этого месяца".
- "#" обозначает "N-й" будний день в месяце; например, "вторая пятница февраля" будет "2#2".
Специальные строки Cron
Демон cron имеет несколько сокращений, которые облегчают определение заданий.
Эти слова имеют точное значение, и вы можете использовать их в синтаксисе вместо 5-колоночной спецификации даты. Ниже перечислены некоторые сокращения Cron:
- @hourly: Это то же самое, что и "0 * * * * *", и выполняет команду в начале каждого часа.
- @daily: То же, что и "0 0 * * * * *", и выполняет команду один раз в день, в 12 часов ночи (полночь).
- @weekly: То же самое, что и "0 0 * * * 0", и команда выполняется каждую неделю в воскресенье в полночь.
- @monthly: То же самое, что и "0 0 1 * * *", и команда выполняется в 12 часов ночи (полночь) каждого первого дня месяца.
- @yearly: То же, что и "0 0 1 1 * *", и выполняет команду раз в год 1 января в полночь.
- @reboot: При каждом перезапуске системы будет выполняться эта команда.
Переменная среды
Когда cron запускает задание, параметр окружения в строке Crontab может задавать переменные окружения.
В Crontab параметр окружения может быть добавлен как:
1 | имя = значение |
Пробелы вокруг "value" необязательны. Кроме того, строка заключена в кавычки, чтобы сохранить пробелы в конце или впереди.
Cron устанавливает некоторые переменные окружения автоматически:
- Переменная SHELL устанавливается в значение "/bin/sh".
- Строка crontab owner directory "/etc/passwd" используется для установки HOME и LOGNAME. SHELL и HOME могут быть изменены во время выполнения с помощью настроек crontab, но мы не можем сделать то же самое с LOGNAME.
- Иногда переменная LOGNAME известна как "USER" в системах BSD. Мы также должны установить конфигурацию "USER".
Переменные Crontab
Ниже перечислены некоторые из наиболее регулярно используемых переменных cron:
- PATH: Это список каталогов, которые будут искаться cron.
- MAILTO: Указывает, кто будет получать вывод каждой команды по электронной почте.
- HOME: Домашняя директория вошедшего в систему пользователя.
- LOGNAME: Имя текущего пользователя.
- LANG: Текущая конфигурация локали.
- EDITOR: Редактор по умолчанию для файлов.
- MAIL: Место хранения почты текущего пользователя.
- TERM: текущая эмуляция терминала.
- USER: Текущий пользователь, который в данный момент вошел в систему.
- SHELL: маршрут оболочки текущего пользователя, например, bash.
Параметры команды Crontab
- -u [user]: Эта опция поможет вам определить пользователя.
- -n [host]: Установите любой хост в кластере для выполнения кронтабов пользователей с помощью опции "-n".
- -x [маска]: Используйте опцию "-x" для включения отладки.
- -e: Эта опция используется для редактирования пользовательского кронтаба.
- -r: Для удаления кронтаба пользователя используйте опцию "-r".
- -l: Чтобы перечислить кронтаб пользователя, пропишите "-l" в команде crontab.
- -c: Чтобы заставить хост в кластере выполнять кронтабы пользователей, используйте опцию "-c".
- -i: Для запроса перед удалением используется опция "-i".
- -s: Проверить контекст SELinux с помощью опции "-s".
Установка Cron в CentOS
По умолчанию cron включен в CentOS. По некоторым причинам, если у вас его еще нет, установите его в вашей системе:
1 2 3 | sudo dnf install cron sudo systemctl enable --now crond.service sudo systemctl status crond |
Планировщик Crontab: Общесистемный
Большинство служб регулярно используют crontab. Службы используют свои настройки планировщика crontab прямо в директории "/etc/cron.d". После этого планировщик будет автоматически выполнять файлы, находящиеся в этом каталоге. Ниже перечислены предварительно настроенные папки crontab: "/etc/cron.hourly", "/etc/cron.daily", "/etc/cron.weekly" и "/etc/cron.monthly". Администраторы Linux имеют полный контроль над этими каталогами. В то же время, планировщик регулярно просматривает и выполняет эти файлы crontab. Кроме того, если пользователь root хочет что-то выполнить, например, он хочет выполнять определенный скрипт каждый день, он помещает файл в каталог "/etc/cron.daily".
Доступ к Cron
Вы можете назначить контроль над выполнением любого файла с помощью cron. Оцените эту функциональность, используя следующие файлы:
/etc/cron.allow: Разрешить
/etc/cron.deny: Запретить
Следует иметь в виду:
- Только пользователь root может использовать cron, если оба вышеупомянутых файла отсутствуют.
- Используя cron, добавьте перед файлом имя, хотите ли вы запретить или разрешить какое-либо конкретное имя файла.
- Добавьте строку ALL перед файлом cron.deny, если вы не хотите, чтобы какой-либо другой пользователь использовал cron.
- Если в файле cron.deny ничего не написано, все пользователи могут работать с cron.
- Если имя пользователя встречается в обоих файлах: cron.allow и cron.deny, то этот пользователь все равно может использовать cron.
- Предположим, что пользователь упоминается в cron.deny, но не существует файла cron.allow относительно этого пользователя; тогда ВСЕ пользователи могут использовать cron, кроме указанного.
Управление Crontab
Как мы уже говорили ранее, crontab - это определенный файл, содержащий расписание заданий, выполняемых cron. С другой стороны, эти задания не предназначены для прямого редактирования. Для этого рекомендуется использовать команду Crontab. Команда crontab позволяет редактировать crontab, относящийся к вашему профилю пользователя, без необходимости изменения ваших привилегий. Эта команда также уведомит вас об ошибках, присутствующих в crontab, что невозможно при прямом редактировании. Используйте следующую команду для редактирования crontab:
1 | crontab -e |
В системах Linux каталог "/etc/" содержит еще один файл crontab. В указанном месте существует общесистемный crontab, который включает поле, указывающее, какие привилегии пользовательского профиля для выполнения cronjobs. Для изменения общесистемного crontab воспользуйтесь следующей командой:
1 | sudo nano /etc/crontab |
Другой более простой способ доступа к файлу crontab и его редактирования - использование редактора "nano". Сделайте "nano" редактором по умолчанию, выполнив следующие шаги:
1 | nano ~/.bash_profile |
Добавьте следующую строку в начало открытого файла:
1 | export VISUAL="nano" |
Сохраните добавленную строку в " ~/.bash_profile" и выйдите. После этого перезагрузите файл "~/.bash_profile".
1 | . ~/.bash_profile |
Теперь выполните эту команду для добавления cronjobs:
1 | crontab -e |
Для просмотра содержимого файла crontab воспользуйтесь следующей командой:
1 | crontab -l |
В настоящее время мы не добавили ни одного задания в файл crontab для вывода на печать.
Чтобы удалить cronjobs, запланированные в файле crontab, выполните следующую команду:
1 | crontab -r |
Примеры Cronjob
1: Выполнение Cronjob через каждые 50 минут
Следующая команда crontab будет выполнять "updatedb" через каждые 50 минут:
1 | 50 * * * * * updatedb |
2: Выполнение Cronjob в указанное время и месяцы
Пример кронтаба для выполнения /usr/local/bin/testscript.sh в 20:00 20 января, февраля, марта и апреля:
1 | 00 08 20 1,2,3,4 * /usr/local/bin/testscript.sh |
3: Выполнение Cronjob каждую пятницу в 13:00.
Приведенная ниже команда позволит системе выполнять файл "testscript.sh" каждую пятницу в 13:00:
1 | 0 01 * * * fri /scripts/testscript.sh |
4: Выполнение Cronjob через каждую минуту
Чтобы выполнить определенный скрипт через каждую минуту, посмотрите синтаксис этой команды:
1 | * * * * * /scripts/testscript.sh |
5: Выполнение Cronjob в указанные дни
Ниже приведен пример, который поможет вам, если вы хотите запланировать выполнение cronjob в определенные дни. Этот пример будет запускать файл "testscript.sh" в понедельник и среду в 14:00:
1 | 0 02 * * * mon,wed /script/testscript.sh |
6: Выполнение Cronjob в первый понедельник каждого месяца
В этом примере недостаточно задать параметр времени. Мы будем использовать условие, чтобы указать, что определенный скрипт должен выполняться в первый понедельник каждого месяца:
1 | 0 2 * * * mon [ $(date +%d) -le 07 ] && /script/testscript.sh |
7: Выполнение Cronjob каждые 10 секунд
Снова укажем условие для выполнения cronjob каждые 10 секунд:
1 | * * * * * sleep 10; /scripts/script.sh |
8: Выполнение Cronjob для нескольких задач
Используйте (;) для настройки cron на выполнение нескольких команд следующим образом:
1 | * * * * * /scripts/testscript1.sh; /scripts/testscript2.sh |
9: Выполнение Cronjob в начале каждого года с использованием "@yearly"
Выполнение задания в первую минуту нового года полезно в том случае, если вам нужно отправить кому-то поздравления с Новым годом. "0 0 1 1 *" аналогично метке времени
1 | @yearly /scripts/testscript.sh |
10: Выполнение Cronjob в начале каждого месяца с помощью "@monthly"
Вы можете использовать временную метку "@monthly" для выполнения ежемесячных задач, таких как выставление счетов клиентам и оплата счетов:
1 | @monthly /scripts/testscript.sh |
11: Выполнение Cronjob в начале каждой недели с использованием "@weekly"
Выполните любое задание в начале недели, например, очистку системы, используя временную метку "@weekly". "weekly" эквивалентно "0 0 * * * mon":
1 | @weekly /bin/testscript.sh |
12: выполнение cronjob в начале каждого месяца с использованием "@daily"
Временная метка "@daily" эквивалентна "0 0 * * * *". Он используется для выполнения ежедневного задания:
1 | @daily /scripts/script.sh |
13: Выполнение Cronjob в начале каждого часа с использованием "@hourly"
Временная метка "@hourly" эквивалентна "0 * * * * *". Вы можете использовать эту временную метку для выполнения ежечасных задач:
1 | @hourly /scripts/testscript.sh |
14: Выполнение Cronjob для перезагрузки системы
"@reboot" удобен для действий, которые вы хотите выполнять при каждой загрузке системы. Это полезно для автоматического запуска задач в фоновом режиме. Этот тип cronjob используется для планирования сценариев запуска.
1 | @reboot /scripts/testscript.sh |
Создание Cronjob для конкретного пользователя
Чтобы запланировать cronjob для определенного пользователя, укажите его имя следующим образом:
1 | ***** username /path_to_script |
Теперь давайте проверим быстрый пример:
1 | 50 * * * * * user updatedb |
Эта команда будет выполнять "updatedb" через каждые 50 минут для пользователя "user".
Вывод списка Cronjobs
Используйте эту команду, чтобы вывести список запланированных cronjobs в вашей системе:
1 | crontab -l |
Создание резервной копии Cronjobs
Чтобы создать резервную копию запланированных cronjobs, используйте эту команду:
1 | crontab -l > cron-backup.txt |
Проверьте содержимое файла "cron-backup.txt", чтобы убедиться в наличии или отсутствии резервной копии заданий:
1 | cat cron-backup.txt |
Очистка задач Cronjobs
1: Без запроса
Для удаления cronjobs используется команда "crontab -r":
1 | crontab -r |
2: С подсказкой
Выполнение следующей команды покажет вам подсказку перед удалением кронтаба:
1 | crontab -i -r |
Управление выводом Cronjob
Как мы уже говорили во введении к cronjob, эти задания работают в фоновом режиме. По этой причине не всегда очевидно, успешно ли они выполнили задание или нет. На данный момент вы имеете некоторое представление о планировании cronjob и его использовании. Теперь вы можете поэкспериментировать с различными способами перенаправления вывода cronjobs. Это перенаправление поможет вам отслеживать функциональность cronjobs.
Например, вы можете отправить выходные данные cronjobs на адрес электронной почты, связанный с вашим профилем пользователя Linux, если на вашем сервере установлен и настроен агент передачи почты, такой как "Sendmail". Для сравнения, параметр "MAILTO" в верхней части кронтаба также может быть использован для указания адресов электронной почты вручную. Добавьте следующие строки в ваш файл crontab, в котором у нас есть утверждение "MAILTO", за которым следует адрес моей электронной почты, директива HOME, указывающая на каталог, где должен быть найден двоичный файл cron, одна задача cron и директива SHELL, указывающая оболочку для запуска, которая в нашем случае является bash.
1 2 3 4 5 | SHELL=/bin/bash HOME=/ 50 * * * * user updatedb * * * * * echo 'Run this command every minutes' |
Эта задача вернет сообщение "Run this command every minutes". Результат будет отправлен по электронной почте на указанный адрес электронной почты, присутствующий в директиве "MAILTO". Чтобы не получать письмо с результатом, вы можете перенаправить вывод задачи cron в пустое место или файл журнала.
Для отправки вывода запланированной команды в файл журнала: добавьте >> в конец команды с именем и путем к директории, содержащей файл журнала, как показано ниже:
1 | * * * * * * echo 'Выполнять эту команду каждую минуту' >> /directory/path/file.log |
Обработка ошибок Cronjob
1: Использование /dev/null
Вместо того чтобы получать оповещение по электронной почте, вы можете легко отправить наши ошибки и журнал cronjob в dev/null. Все, что мы отправляем или записываем в dev/null, отбрасывается.
1 | * * * * * cd /home/user && /bin/bash shell-testscript.sh > /dev/null 2>&1 |
Часть команды "> /dev/null" указывает cron перенаправить стандартный выход (STDOUT) на /dev/null.
Дескриптор файла "2" предназначен для стандартной ошибки (STDERR), в то время как дескриптор файла стандартного выхода - "1".
2: Отправка вывода в определенный файл
Это популярный метод, и большинство пользователей предпочитают именно его. В этом методе вы должны создать файл для сохранения журналов cronjob. Если задание выполнено успешно, будет выведен результат, в противном случае будет выведена ошибка.
Мы создали образец файла журнала для этой цели, поэтому напишем эту команду следующим образом:
1 | * * * * * cd /home/user && /bin/bash shell-testscript.sh>>> samplefile.log |
Где:
- "* * * * *" указывает на то, что задание будет выполняться каждую минуту.
- Путь и исполняемый каталог оболочки Bash - "/bin/bash".
- Каталог будет изменен на "/home/user", который содержит сценарий shell-testscript.sh.
- Символ ">>" добавляет вывод к ранее созданному файлу "samplefile.log", тогда как одиночный символ > перезаписывает файл.
Заключение
Cron - это универсальный и мощный инструмент, который может помочь вам в решении различных задач системного администрирования. Вы можете автоматизировать операции, которые обычно сложны с помощью сценариев оболочки. Эта статья представляет собой полное руководство по crontab для начинающих, в котором обсуждалось все, включая работу crontab, его использование, установку на CentOS, практические примеры cronjobs и генераторы синтаксиса crontab.