Ubuntu. Запуск задач по расписанию
11.03.2022
Теги: Linux • Ubuntu • Конфигурация • Настройка
Cron — это демон, который можно использовать для назначения запуска повторяющихся заданий по расписанию, задаваемого по времени, дню месяца, месяцу, дню недели и неделям.
Основной файл конфигурации
Основной системный конфигурационный файл — /etс/crontab
, его может редактировать только пользователь root
. Нужно указать время запуска, команду для запуска + пользователя, от имени которого должна выполняться команда.
# /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the 'crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # 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 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
Первые две строки — это переменные, настраивающие окружение, в котором будут работать задачи cron
. Переменная SHELL
сообщает системе, какую оболочку использовать, а переменная PATH
определяет пути, используемые при выполнении команд или скриптов.
Дополнительные файлы конфигурации
Кроме основного файла конфигурации /etс/crontab
, можно создавать доп.файлы конфигурации в директории /etc/cron.d/
— формат этих файлов совпадает с основным. Демон cron
будет проверять расписание заданий в этих файлах и запускать их в назаченное время — наравне с заданиями из файла /etс/crontab
.
$ ls -la /etc/cron.d итого 36 drwxr-xr-x 2 root root 4096 янв 26 09:43 . drwxr-xr-x 134 root root 12288 фев 5 06:38 .. -rw-r--r-- 1 root root 285 июл 16 2019 anacron -rw-r--r-- 1 root root 201 фев 14 2020 e2scrub_all -rw-r--r-- 1 root root 712 мар 27 2020 php -rw-r--r-- 1 root root 102 фев 13 2020 .placeholder -rw-r--r-- 1 root root 191 янв 20 20:43 popularity-contest
Как правило, сразу после установки Ubuntu здесь уже есть несколько файлов с заданиями. Например, popularity-contest
отправляет разработчикам ОС статистику о наиболее часто используемых пакетах.
$ cat /etc/cron.d/popularity-contest SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 18 14 * * * root test -x /etc/cron.daily/popularity-contest && /etc/cron.daily/popularity-contest --crond
Директория /etc/cron.hourly и другие
Пользователь root
может размещать в этой директории скрипты, чтобы они запускались каждый час. Если посмотреть содержимое основного конфигурационного файла /etс/crontab
— можно увидеть строку, которая запускает скрипты на 17-ой минуте каждого часа.
# 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 17 * * * * root cd / && run-parts --report /etc/cron.hourly
run-parts
запускает на выполнение все скрипты в заданной директории, в порядке лексической сортировки их имён, если не задана опция --reverse
, в этом случае они будут запускаться в противоположном порядке. Естественно, файлы скриптов должны иметь права на выполнение.
Следующие три строки запускают скрипты в директориях cron.daily
, cron.weekly
и cron.monthly
:
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
Cron
будет сам запускать скрипты, только если в системе нет anacron
(см.ниже) — поэтому с помощью команды test
проверяется существование /usr/sbin/anacron
с правами на выполнение.
Настройка заданий пользователей
Обычно нет необходимости в редактировании /etс/crontab
, пользователи могут настраивать запуск заданий, используя команду crontab
. Все созданные пользователями файлы crontab
хранятся в каталоге /var/spool/cron/crontabs/
и команды (скрипты) будут выполнены от имени создавшего их пользователя.
$ crontab -e
# Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any'). # # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command # выгрузка на сайт сертификатов номенклатур в 1:30 ночи 30 1 * * * /home/username/cron/certificates-upload.php # выгрузка на сайт документации к номенклатурам в 2:30 ночи 30 2 * * * /home/username/cron/documentation-upload.php
При первом запуске команды crontab -e
будет предложено выбрать редактор для внесения изменений. В дальнейшем редактор можно изменить с помощью команды select-editor
.
$ crontab -e Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/mcedit 3. /usr/bin/vim.tiny 4. /bin/ed Choose 1-4 [1]: 1
Команда crontab -l
позволяет просмотреть содержимое файла crontab
, а команда crontab -r
— удалить этот файл целиком (так что с этой командой нужно быть осторожным).
$ crontab -l # просмотреть содержимое crontab $ crontab -r # полностью удалить файл crontab
Если команда или скрипт требуют привилегий суперпользователя — нужно создать файл /var/spool/cron/crontabs/root
:
$ sudo crontab -e
Ограничение доступа к демону
Для ограничения доступа к cron
используются файлы /etc/cron.allow
и /etc/cron.deny
, в которых задаются имена пользователей. Если существует cron.allow
, то только указанным в нем пользователям разрешено использовать демона, файл cron.deny
игнорируется. Если отсутствует cron.allow
, то пользователям из cron.deny
запрещается использовать демон.
Синтаксис файла crontab
Crontab-файл имеет пять полей для указания времени запуска задачи:
- Минуты — минута, когда будет запущена команда, в диапазоне от 0 до 59.
- Часы — час, когда будет запущена команда, в диапазоне от 0 до 23.
- День месяца — в какой день месяца будет запущена команда, в диапазоне от 1 до 31.
- Месяц — в какой месяц года будет запущена команда, в диапазоне от 1 до 12.
- День недели — день недели, когда будет запущена команда, от 0 до 7 (воскресенье — 0 или 7).
Допускается использование следующих символов:
- Звёздочка — чтобы задавать значение «любой,каждый» (каждый час или в любую минуту).
- Запятая — чтобы указать два, три или больше вариантов времени выполнения задачи.
- Дефис — чтобы задать диапазон времени «от и до» выполнения задачи.
- Слэш — чтобы указать интервал запуска в диапазоне,
0-44/4
— запуск каждую 4-ю минуту в интервале 0-44. - Last (L) — чтобы указать последний день недели в данном месяце (например, 3L означает последнюю среду).
- Вопросительный знак — чтобы выбрать определённый день для запуска задачи, нужно указать либо число месяца, либо номер дня. Вопросительный знак даёт возможность оставить одно значение пустым.
Несколько примеров указания времени запуска:
# время запуска — два раза в сутки, в полночь и в полдень 0 0,12 * * * /home/username/cron/database-backup.sh # время запуска — 6:03, 6:08, 6:13, …, 20:48, 20:53, 20:58 3-58/5 6-20 * * * /home/username/cron/exchange.sh # время запуска — каждые пять минут с 8 утра до 21 вечера */5 8-20 * * * /home/username/cron/monitoring.sh # время запуска — с понедельника по пятницу, в полдень 0 12 * * 1-5 /home/username/cron/cbr-get-currency.sh
Для некоторых часто используемых расписаний есть удобные сокращения:
@yearly
,@annually
— раз в год@monthly
— раз в месяц@weekly
— раз в неделю@daily
,@midnight
— каждый день@hourly
— каждый час@reboot
— при загрузке
# время запуска — в самом начале года, когда бьют куранты 0 0 1 1 * /home/username/cron/happy-new-year.sh # время запуска — в самом начале года, когда бьют куранты @yearly /home/username/cron/happy-new-year.sh # время запуска — каждый час, в любой день, круглый год 0 * * * * /home/username/cron/update-prices.sh # время запуска — каждый час, в любой день, круглый год @hourly /home/username/cron/update-prices.sh # время запуска — после каждой перезагрузки системы @reboot /home/username/cron/after-reboot.sh
Логи выполнения cron-задач
По умолчанию в Ubuntu запись идет в файл /var/log/syslog
, просмотреть записи выполнения конкретной задачи можно так:
$ cat /var/log/syslog | grep "orders-export.php" Mar 10 08:01:01 ..... CRON[634407]: (username) CMD (/home/username/cron/orders-export.php) Mar 10 08:04:01 ..... CRON[634469]: (username) CMD (/home/username/cron/orders-export.php) Mar 10 08:07:01 ..... CRON[634517]: (username) CMD (/home/username/cron/orders-export.php) Mar 10 08:10:01 ..... CRON[634603]: (username) CMD (/home/username/cron/orders-export.php) Mar 10 08:13:01 ..... CRON[634642]: (username) CMD (/home/username/cron/orders-export.php) ..........
Можно настроить запись cron-задач в отдельный лог-файл, для этого редактируем файл конфигурации /etc/rsyslog.d/50-default.conf
:
$ sudo nano /etc/rsyslog.d/50-default.conf
auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog cron.* /var/log/cron.log #daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log #lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log #user.* -/var/log/user.log
После этого можно исключить cron-записи из системного журнала, чтобы они были только в журнале cron
:
auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none;cron.none -/var/log/syslog cron.* /var/log/cron.log #daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log #lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log #user.* -/var/log/user.log
Anacron — анахроничный cron
Anacron
в отличие от cron
не поддерживает запуск заданий по расписанию, вместо этого задания запускаются с заданным интервалом времени. Это очень удобно для систем, которые работают не регулярно, например домашний компьютер или ноутбук. Задачи anacron
хранятся в файле /etc/anacrontab
, который доступен для редактирования только root
.
# /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin HOME=/root LOGNAME=root # These replace cron's entries 1 5 cron.daily run-parts --report /etc/cron.daily 7 10 cron.weekly run-parts --report /etc/cron.weekly @monthly 15 cron.monthly run-parts --report /etc/cron.monthly
Каждая строка запуска задачи содержит четыре поля:
период задержка идентификатор выполняемая-команда
Задание с идентификаторами cron.daily
будет запускаться каждый день с задержкой 5 минут. Задание с идентификаторами cron.weekly
будет запускаться каждый седьмой день (то есть раз в неделю) с задержкой 10 минут. Задание с идентификаторами cron.monthly
будет запускаться каждый месяц с задержкой 15 минут.
Каждое из этих заданий запустит на выполнение все скрипты из директорий /etc/cron.daily
, /etc/cron.weekly
, /etc/cron.monthly
.
Для каждой задачи anacron
определяет, выполнялась ли она в период, указанный в поле период
файла конфигурации. Если задача не выполнялась в указанный период, anacron
выполняет команду, указанную в последнем поле, через промежуток времени, указанный в поле задержка
.
Выполнив задачу, anacron
записывает дату в файл с отметкой времени и сохраняет его в каталоге /var/spool/anacron
. Сохраняется только дата (не время), а значение поля идентификатор
используется для формирования имени файла, помещаемого в /var/spool/anacron
.
$ ls -la /var/spool/anacron итого 20 drwxr-xr-x 2 root root 4096 янв 20 20:47 . drwxr-xr-x 6 root root 4096 янв 20 20:45 .. -rw------- 1 root root 9 мар 11 07:37 cron.daily -rw------- 1 root root 9 фев 17 07:47 cron.monthly -rw------- 1 root root 9 мар 10 07:44 cron.weekly
$ sudo cat /var/spool/anacron/cron.daily 20220311
$ sudo cat /var/spool/anacron/cron.monthly 20220217
Здесь мы видим, что скрипты из директории /etc/cron.daily
выполнялись 11 марта 2022 года. И в следующий раз будут выполнены через день, то есть 12 марта 2022 года. А скрипты из директории /etc/cron.monthly
выполнялись 17 февраля 2022 года. И в следующий раз будут выполнены 17 марта 2022 года.
- Ubuntu. Настройка сети
- Ubuntu. Автоматическое обновление
- Ubuntu. Создание юнита для Systemd
- Установка WireGuard на Ubuntu 20.04 LTS. Часть вторая из двух
- Установка WireGuard на Ubuntu 20.04 LTS. Часть первая из двух
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 12 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 11 из 12
Поиск: Linux • Ubuntu • Конфигурация • Настройка • cron • расписание • год • месяц • неделя • день • час • минута