Глава 35. Автоматизация задач
В Linux вы можете настроить автоматический запуск заданий в определённый период времени, в определённый день или в момент, когда средняя нагрузка системы опускается ниже заданного значения. В Red Hat Enterprise Linux предварительно настроены важные системные задачи для поддержания актуального состояния системы. Например, база данных slocate, используемая командой locate, обновляется ежедневно. Системный администратор может использовать автоматизацию для выполнения периодического резервного копирования, наблюдения за системой, запуска собственных сценариев и т. д.
В Red Hat Enterprise Linux включены несколько утилит автоматизации задач: cron, at и batch.
35.1. Cron
Cron — это демон, который можно использовать для назначения запуска повторяющихся заданий по расписанию, задаваемого по времени, дню месяца, месяцу, дню недели и неделям.
Cron подразумевает, что система работает непрерывно. Если система не была включена в момент, на который была назначено задание, оно не будет выполнено. За информацией о назначении одноразовых заданий, обратитесь к разделу 35.2 Задания at и batch.
Для использования службы cron, необходимо, чтобы был установлен RPM-пакет vixie-cron и работала служба crond. Чтобы определить, установлен ли этот пакет, выполните команду rpm -q vixie-cron. Чтобы определить, работает ли служба, воспользуйтесь командой /sbin/service crond status.
35.1.1. Настройка заданий cron
Основной файл конфигурации cron, /etc/crontab, содержит следующие строки:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly
Первые четыре строки — это переменные, настраивающие окружение, в котором будут работать задачи cron. Переменная SHELL сообщает системе, какую оболочку использовать (в данном примере это оболочка bash), а переменная PATH определяет пути, используемые при выполнении команд. Результат выполнения задач cron будет выслан по электронной почте пользователю, определённому в переменной MAILTO . Если в качестве значения переменной MAILTO задана пустая строка ( MAILTO=»» ), электронные письма не отправляются. Переменная HOME задаёт домашний каталог, используемый при выполнении команд или сценариев.
Каждая строка в файле /etc/crontab представляет отдельное задание и имеет следующий формат:
minute hour day month dayofweek command
- minute — любое целое число от 0 до 59
- hour — любое целое от 0 до 23
- day — любое целое от 1 до 31 (день должен быть допустимым, если задан месяц)
- month — любое целое от 1 до 12 (или краткое название месяца, например, jan, feb и т. д.)
- dayofweek — любое целое от 0 до 7, где 0 или 7 обозначает воскресенье (или краткое название дня недели, например, sun или mon)
- command — выполняемая команда (это может команда вроде ls /proc >> /tmp/proc или команда, запускающая дополнительный сценарий)
Для любых указанных выше параметров можно использовать звездочку (*), что означает все допустимые значения. Например, если поставить звёздочку в значении месяца, команда будет выполняться каждый месяц в день, определённый другими параметрами.
Дефис (-) между целыми числами обозначает диапазон чисел. Например, 1-4 обозначает набор целых чисел 1, 2, 3 и 4.
Последовательность значений, разделенных запятыми (,), обозначает список. Например, перечисление 3, 4, 6, 8 обозначает четыре указанных целых числа.
Прямая косая черта (/) используется для определения шага значений. Число в диапазоне может быть пропущено, если после диапазона указать / < целое >. Например, значение поля минут 0-59/2 , определяет, что будет пропущена каждая вторая минута. В качестве шага значений также может быть указана звёздочка. Например, чтобы запускать задание раз в три месяца, в поле месяца можно использовать значение */3
Любые строки, начинающиеся с символа решетки (#), являются комментариями и не обрабатываются.
Как показывает пример файла /etc/crontab, сценарий run-parts запускает сценарии в каталогах /etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/ и /etc/cron.monthly/ каждый час, день, неделю, месяц соответственно. Файлы в этих каталогах должны быть сценариями оболочки.
Если задание cron нужно выполнить по расписанию, но не ежечасно, ежедневно, еженедельно или ежемесячно, его можно добавить в каталог /etc/cron.d. Все файлы в этом каталоге имеют тот же синтаксис, что и /etc/crontab. Примеры заданий показаны в примере 35-1.
# записывает данные об использовании памяти в системе каждый понедельник # в 3:30 в файл /tmp/meminfo 30 3 * * mon cat /proc/meminfo >> /tmp/meminfo # запускает специальный сценарий каждый день каждого месяца в 4:10 10 4 1 * * /root/scripts/backup.sh
Пример 35-1. Пример заданий crontab
Другие пользователи (не root) также могут настраивать задачи cron, используя программу crontab. Все созданные пользователями файлы crontab хранятся в каталоге /var/spool/cron/ и выполняются от имени создавшего их пользователя. Чтобы создать файл crontab для пользователя, войдите в систему под его именем и введите команду crontab -e, чтобы отредактировать его файл crontab с помощью редактора, указанного в переменной окружения VISUAL или EDITOR . Этот файл имеет тот же формат, что и /etc/crontab. При записи изменений файла crontab этот файл сохраняется под названием /var/spool/cron/ username , в соответствии с именем пользователя.
Демон cron проверяет наличие изменений в файле /etc/crontab, каталоге /etc/cron.d/ и каталоге /var/spool/cron/ каждую минуту. Если обнаруживаются какие-либо изменения, они загружаются в память. Таким образом, демон не нуждается в перезапуске при изменении файла crontab.
35.1.2. Управление доступом к cron
Для ограничения доступа к cron используются файлы /etc/cron.allow и /etc/cron.deny. Формат списков управления доступом в обоих файлах прост — в каждой строке файла указывается одно имя пользователя. Пробельные символы в этих файлах не допускаются. Перезапускать демон cron (crond) после изменения файлов управления доступом не требуется. Файлы управления доступом обрабатываются каждый раз, когда пользователь пытается добавить или удалить задание cron.
Пользователь root может использовать cron, вне зависимости от того, какие пользователи перечислены в файлах управления доступом.
Если файл cron.allow существует, использовать cron разрешено только перечисленным в нём пользователям, а файл cron.deny игнорируется.
Если cron.allow не существует, пользователям, перечисленным в cron.deny, использовать cron не разрешается.
35.1.3. Запуск и остановка службы
Чтобы запустить службу cron, выполните команду /sbin/service crond start. Чтобы остановить её, выполните команду /sbin/service crond stop. Рекомендуется настроить запуск этой службы при загрузке системы. За подробными инструкциями по настройка автоматического запуска службы cron при загрузке системы обратитесь к главе 20 Управление доступом к службам.
How to schedule jobs using the Linux ‘cron’ utility
A skilled sysadmin knows when and how to programmatically schedule tasks to be executed at specific intervals, whether they’re recurring or happen a set number of times. You can apply this skill in many scenarios, such as scheduling backups, collecting system logs periodically, or automating basic and repetitive tasks.
[ Keep your most commonly used commands handy with the Linux commands cheat sheet. ]
You can schedule tasks in numerous ways, and in this article, I will focus on the cron utility. My colleague Ken previously wrote a great article about cron , so I recommend you check it out, as well as my previous article about the at command, another way to schedule tasks in Linux.
In this article, I’ll try to be as succinct, straightforward, and practical as possible, meaning I won’t be able to explore all available options for cron .
How ‘cron’ works
I’ll cover a few basics before playing around with cron . First, cron also uses a daemon ( crond ) that reads different configuration files. There’s a cron file for each user in the /etc/cron.d/ directory, and the /etc/crontab file is system-wide. Every user manages their own scheduled jobs and cron configuration file.
$ sudo systemctl status crond ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2022-11-11 15:13:12 -03; 1h 17min ago Main PID: 2732 (crond) Tasks: 2 (limit: 23644) Memory: 73.7M CGroup: /system.slice/crond.service ├─2732 /usr/sbin/crond -n └─4752 /usr/sbin/anacron -s nov 11 15:13:12 demo.example.local systemd[1]: Started Command Scheduler. nov 11 15:13:12 demo.example.local crond[2732]: (CRON) STARTUP (1.5.2) nov 11 15:13:12 demo.example.local crond[2732]: (CRON) INFO (Syslog will be used instead of sendmail.) nov 11 15:13:12 demo.example.local crond[2732]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 33% if used.) nov 11 15:13:13 demo.example.local crond[2732]: (CRON) INFO (running with inotify support) nov 11 15:13:13 demo.example.local CROND[2754]: (root) CMD (sleep 60 && /sbin/katello-tracer-upload > /dev/null 2>&1) nov 11 16:01:01 demo.example.local CROND[4743]: (root) CMD (run-parts /etc/cron.hourly) nov 11 16:01:01 demo.example.local anacron[4752]: Anacron started on 2022-11-11 nov 11 16:01:01 demo.example.local anacron[4752]: Will run job `cron.daily' in 43 min. nov 11 16:01:01 demo.example.local anacron[4752]: Jobs will be executed sequentially $ ls -l /etc/crontab -rw-r--r--. 1 root root 451 jan 8 2021 /etc/crontab $ ls -l /etc/cron.d/ total 16 -rw-r--r--. 1 root root 128 set 30 2021 0hourly -rw-r--r--. 1 root root 450 set 23 18:11 foreman_scap_client_cron -rw-r--r--. 1 root root 112 fev 10 2022 katello-tracer-upload -rw-r--r--. 1 root root 108 fev 24 2022 raid-check
Training & certification
Schedule jobs with ‘cron’
To manipulate scheduled cron jobs, you can edit the crontab file (for system-wide tasks) or create files inside the user’s cron.d directory (for specific tasks) with the necessary parameters inside them. Below are the most common crontab parameters:
- -l displays the current crontab (jobs from the current user) on standard output.
- -r removes the current crontab (jobs from the current user).
- -e edits the current crontab (jobs from the current user) using the editor specified by the VISUAL or EDITOR environment variables. After you exit the editor, the modified crontab is installed automatically.
The most important part of understanding how cron schedules work is knowing the syntax used in the crontab file, as follows (taken from an empty default crontab file):
$ cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr . # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
- Use x-y for a range: For example, place 1-5 in the Days column for a job to run from Monday to Friday.
- Use x,y for lists: For example, place 5,10-13,17 in the Minutes column for a job to run at 5, 10, 11, 12, 13, and 17 minutes past the hour.
- Use */x to indicate an interval of x: For example, place */7 in the Minutes column to run a job every seven minutes.
[ Want to test your sysadmin skills? Take a skills assessment today. ]
Start by checking whether the current user has any scheduled jobs:
$ crontab -l no crontab for localuser