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-задач в отдельный лог-файл 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 # исключаем cron-записи из журнала syslog *.*;auth,authpriv.none;cron.none -/var/log/syslog # запись cron-задач в отдельный лог-файл 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 • расписание • год • месяц • неделя • день • час • минута