Cron – это планировщик задач Unix-подобных операционных систем, работающий в фоновом режиме. Задачи, запланированные в cron, называются «cron jobs» и запускаются автоматически. Благодаря этому cron очень удобно использовать для поддержки сервера без вмешательства администратора.
Этот мануал научит вас автоматизировать запуск задач cron с помощью специального синтаксиса. Также мы познакомим вас с сокращениями, которые помогут вам быстрее писать и читать задачи cron.
Требования
Для работы вам понадобится машина CentOS 8. Это может быть ваш локальный компьютер, виртуальная машина или выделенный сервер.
Вне зависимости от того, какую машину вы используете, вы должны настроить ее по этому мануалу.
1: Установка cron
Почти в каждом дистрибутиве Linux cron установлен по умолчанию. Но если на вашей машине демон cron не предустановлен, вы можете установить его с помощью менеджера пакетов.
Для начала обновите индекс локальных пакетов.
sudo dnf update
Затем установите cron с помощью этой команды:
sudo dnf install crontabs
Эта команда предложит вам подтвердить, что вы хотите установить пакет crontabs и его зависимости. Чтобы сделать это, нажмите y, а затем Enter.
Это установит cron в вашей системе, но вам нужно будет запустить демон вручную. Вам также необходимо убедиться, что он настроен на запуск при загрузке сервера. Вы можете выполнить оба эти действия с помощью команды systemctl. Запустите демон с помощью этой команды:
sudo systemctl start crond.service
Чтобы добавить cron в автозагрузку, введите:
sudo systemctl enable crond.service
Теперь в вашей системе установлен демон cron, и вы можете приступать к планированию задач.
2: Как работает cron
Задачи cron записываются в специальный файл по имени crontab, с помощью которого можно управлять демоном. Каждый профиль пользователя в системе может иметь свой собственный файл crontab в каталоге /var/spool/cron/.
Чтобы запланировать задачу, нужно просто открыть crontab в редакторе и добавить в файл необходимое вам выражение cron. Синтаксис выражений cron содержит два элемента: время и команду, которую нужно запустить.
Через cron можно запустить практически любую команду, которую обычно вы запускаете в командной строке. Время содержит 5 полей, которые записываются в следующем порядке:
Поле | Допустимые значения |
минуты | 0-59 |
часы | 0-23 |
день месяца | 1-31 |
месяц | 1-12 или JAN-DEC |
День недели | 0-6 или SUN-SAT |
В целом записи в crontab структурированы так:
minute hour day_of_month month day_of_week command_to_run
Вот рабочий пример выражения cron. Оно запускает команду curl http://www.google.com каждый вторник в 17:30.
30 17 * * 2 curl http://www.google.com
Также cron предоставляет несколько специальных символов, которые можно включить в ту часть выражения cron, которая определяет время. Это позволяет упростить планирование:
- *: подстановочная переменная, которая значит «все». Следовательно, задача, запланированная с помощью * * * * * …, будет запускаться каждую минуту каждого часа каждого дня каждого месяца.
- ,: символы запятой разделяют значения календаря и формируют список. Если вы хотите, чтобы задача выполнялась в начале и середине каждого часа, вы можете настроить такое поведение в рамках одного выражения с помощью следующего синтаксиса: например, 0 * * * * … и 30 * * * * … можно объединить в выражение 0,30 * * * * ….
- -: дефис задает диапазон значений в поле времени. Вместо 30 отдельных выражений для одной команды, которую вы хотите запускать в течение первых 30 минут каждого часа (0 * * * * …, 1 * * * * …, 2 * * * * .. и т. д.), вы можете просто использовать одно выражение 0-29 * * * * ….
- /: слеш вместе со звездочкой определяет шаг. Например, чтобы команда запускалась каждые три часа, вы можете запланировать ее следующим образом: 0 * / 3 * * * …. При этом не придется создавать восемь отдельных задач cron (, 0 0 * * * …, 0 3 * * * …, 0 6 * * * … и так далее).
Примечание: Значения шага нельзя выражать произвольно. Вы можете использовать только целые числа, на которые можно разделить заданный диапазон без остатка. Например, в поле «часы» вы можете использовать слеш только с цифрами 1, 2, 3, 4, 6, 8 или 12 (на них можно разделить 24 часа без остатка).
Вот еще несколько примеров планирования времени в cron:
- * * * * * – команда будет запускаться каждую минуту.
- 12 * * * * – команда запускается на 12 минуте каждого часа.
- 0,15,30,45 * * * * – команда запускается каждые 15 минут.
- */15 * * * * – Run the command every 15 minutes.
- 0 4 * * * – команда запускается каждый день в 4:00 утра.
- 0 4 * * 2-4 – команда будет запускаться каждый вторник, среду и четверг в 4:00 утра.
- 20,40 */8 * 7-12 * – команда запускается на 20-й и 40-й минуте каждого 8-го часа каждый день последних 6 месяцев года.
Если вам сложно разобраться с этим вопросом или нужна помощь в планировании времени для ваших задач cron, обратитесь к Cronitor. Он предоставляет удобный редактор выражений cron по имени Crontab Guru, который вы можете использовать для проверки своих записей.
3: Управление файлами crontab
Когда вы определитесь с расписанием задач и поймете, какую задачу хотите запланировать, вам нужно поместить ее в файл, чтобы демон смог ее прочитать.
Мы уже говорили, что crontab – это специальный файл, который содержит расписание задач для cron. Однако файл crontab не следует редактировать вручную. Вместо этого рекомендуется использовать команду crontab. Она будет редактировать файл crontab вашего пользователя, не требуя повышенных привилегий с помощью sudo. Команда crontab также выявляет синтаксические ошибки в файле (редактируя файл вручную, вы можете их не заметить).
Чтобы отредактировать файл crontab, введите:
crontab -e
Эта команда откроет crontab в текстовом редакторе по умолчанию.
Примечание: На новых серверах CentOS 8 команда crontab -e по умолчанию открывает crontab с помощью vi. Редактор vi – очень мощный и гибкий текстовый редактор, но пользователям, которым не хватает опыта работы с ним, он может показаться немного неудобным.
Если вы хотите использовать более удобный текстовый редактор для работы с crontab, вы можете установить и настроить nano.
Установить nano вы можете с помощью dnf:
sudo dnf install nano
При появлении запроса нажмите y, а затем Enter, чтобы подтвердить установку.
Чтобы установить nano в качестве визуального редактора по умолчанию для вашего пользователя, откройте файл .bash_profile для редактирования. Теперь, когда вы установили nano, вы можете открыть файл с его помощью:
nano ~/.bash_profile
В конец файла добавьте следующую строку:
. . .
export VISUAL="nano"
Она задает переменной среды VISUAL значение nano. VISUAL – это переменная среды Unix, которую многие программы, включая crontab, используют для редактирования файла. Добавив эту строку, сохраните и закройте файл, нажав Ctrl + X, Y, а затем Enter.
Затем перезагрузите .bash_profile, чтобы оболочка применила новое значение:
. ~/.bash_profile
В редакторе вы можете ввести свое расписание задач. Каждая задача записывается в отдельную строку. Если вы пока что не хотите ничего добавлять в файл, можете сохранить и закрыть crontab. Если вы открыли файл crontab с помощью vi, текстового редактора CentOS 8 по умолчанию, вы можете закрыть его, нажав ESC, чтобы выйти в режим команд vi, а затем ввести x и нажать Enter.
В системах Linux в каталоге /etc/ хранится еще один crontab. Это общесистемный файл, в котором есть дополнительное поле, оно определяет пользователя, который должен выполнять задачу cron. В этом мануале рассматриваются только пользовательские файлы crontab. Если вы хотите отредактировать общесистемный crontab, вы можете сделать это с помощью следующей команды:
sudo nano /etc/crontab
Если вы хотите просмотреть содержимое вашего crontab, но не редактировать его, вы можете использовать следующую команду:
crontab -l
Внимание! Следующая команда не требует подтверждения, а сразу удаляет все команды из crontab. Запускайте ее, только если вы уверены, что хотите очистить файл.
Вы можете очистить свой crontab с помощью следующей команды:
crontab -r
Эта команда немедленно удалит все записи из пользовательского crontab. Чтобы команда все же запросила подтверждения на очистку файла, вы можете включить флаг –i:
crontab -r -i
crontab: really delete 8host's crontab? (y/n)
При появлении запроса вы должны ввести y, чтобы удалить содержимое crontab, или n, чтобы отменить действие.
4: Управление выводом cron
Поскольку задачи cron выполняются в фоновом режиме, результат их работы не всегда очевиден. Теперь, когда вы знаете, как использовать команду crontab и планировать задачи, вы можете познакомиться с несколькими способами перенаправления вывода cron, что поможет вам отслеживать их выполнение.
Если на вашем сервере установлен и настроен агент пересылки почты, например Sendmail, вы можете отправить выходные данные задач cron на адрес электронной почты, связанный с профилем вашего пользователя Linux. Адрес электронной почты можно указать вручную, добавив параметр MAILTO в начало crontab.
Для примера попробуйте добавить следующие строки в crontab. Среди них есть оператор MAILTO, за которым следует условный электронный адрес, директива SHELL, которая определяет оболочку (в этом примере bash), директива HOME, указывающая путь, по которому следует искать двоичный файл cron, и одна задача cron:
. . .
MAILTO="example@my-email.com"
SHELL=/bin/bash
HOME=/
* * * * * echo ‘Run this command every minute’
Эта конкретная задача будет возвращать строку «Run this command every minute». Этот вывод будет каждую минуту отправляться на адрес электронной почты, указанный в директиве MAILTO.
Вы также можете перенаправить вывод cron в лог или в пустое место, чтобы не получать его на почту.
Чтобы направить вывод запланированной команды в лог, добавьте >> в конец команды, а затем укажите имя и путь к логу:
* * * * * echo ‘Run this command every minute’ >> /directory/path/file.log
Допустим, вы хотите использовать cron для запуска скрипта, который должен работать в фоновом режиме. Для этого вы можете перенаправить вывод скрипта в пустое место, например в /dev/null, которое немедленно удаляет все записанные в него данные. Следующее выражение cron запускает скрипт PHP в фоновом режиме:
* * * * * /usr/bin/php /var/www/domain.com/backup.php > /dev/null 2>&1
Эта задача cron также перенаправляет стандартную ошибку (представленную 2) на стандартный вывод (>&1). Поскольку стандартный вывод уже перенаправляется в /dev/null, скрипт будет работать без вывода. Даже если crontab содержит директиву MAILTO, выходные данные не будут отправляться на указанный адрес.
5: Ограничение доступа
Вы можете указать, каким пользователям можно использовать команду crontab, с помощью файлов cron.allow и cron.deny. Они хранятся в каталоге /etc/. Если файл cron.deny существует, любому из перечисленных в нем пользователей будет запрещено редактировать свой crontab. Если файл cron.allow существует, редактировать свои файлы crontab смогут только пользователи, перечисленные в нем. Если оба файла существуют и в каждом из них указан один и тот же пользователь, файл cron.allow переопределит cron.deny, в результате чего пользователь сможет редактировать свой crontab.
Чтобы запретить всем пользователям доступ к этим файлам, а затем предоставить доступ пользователю ishmael, вы можете использовать следующую последовательность команд:
sudo echo ALL >>/etc/cron.deny
sudo echo ishmael >>/etc/cron.allow
Сначала команда блокирует всех пользователей, добавляя ALL в файл cron.deny. Затем мы вносим имя пользователя ishmael в файл cron.allow, что открывает ему доступ к выполнению cron.
Если у пользователя есть права sudo, он может редактировать crontab другого пользователя с помощью следующей команды:
sudo crontab -u user-2 -e
Но если cron.deny существует, пользователь user-2 указан в нем и не указан в cron.allow, после выполнения предыдущей команды вы получите следующую ошибку:
The user user-2 cannot use this program (crontab)
6: Специальный синтаксис
Чтобы упростить планирование задач, cron предлагает несколько сокращений для команд, которые вы можете использовать в файле crontab. По сути они являются ярлыками определенных значений.
Сокращение | Стандартная запись |
@hourly | 0 * * * * |
@daily | 0 0 * * * |
@weekly | 0 0 * * 0 |
@monthly | 0 0 1 * * |
@yearly | 0 0 1 1 * |
Примечание: Не все версии cron поддерживают этот синтаксис (особенно это относится к устаревшим), потому обязательно проверьте, работает ли ваше выражение.
Также есть сокращение @reboot, оно запустит любую указанную после него команду при запуске сервера:
@reboot echo "System start up"
Эти сокращения помогут вам упростить запись и чтение задач в вашем crontab.
Заключение
Cron – это гибкая и мощная утилита, которая путем автоматизации упрощает задачи, связанные с системным администрированием. В сочетании со скриптами оболочки cron может автоматизировать часто повторяющиеся сложные задачи.
Читайте также: Автоматизация резервного копирования с помощью s3cmd