Ubuntu. Запуск задач по расписанию

11.03.2022

Теги: LinuxUbuntuКонфигурацияНастройка

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 года.

Поиск: Linux • Ubuntu • Конфигурация • Настройка • cron • расписание • год • месяц • неделя • день • час • минута

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.