Планирование и выполнение заданий с помощью Cron
Планирование и выполнение заданий с помощью Cron
В Linux cron — это демон, который работает непрерывно и каждую минуту просыпается, чтобы проверить набор таблиц и найти задачи для выполнения
Пользовательские crontabs — это текстовые файлы, которые управляют расписанием пользовательских заданий cron. Они всегда называются в честь учетной записи пользователя, который их создал, но расположение этих файлов зависит от используемого дистрибутива (как правило, они находятся в подкаталоге /var/spool/cron).
Каждая строка в пользовательском crontab содержит шесть полей, разделенных пробелами:
Минута часа (0–59).
Час дня (0–23).
День месяца (1–31).
Месяц года (1–12).
День недели (0–7, где воскресенье = 0 или 7).
Команда для запуска.
Первые пять полей указывают, когда следует выполнить команду, указанную в шестом поле, и могут содержать одно или несколько значений. В частности, можно указать несколько значений с помощью:
* (звездочка) Относится к любому значению. , (запятая) Указывает список возможных значений. - (тире) Указывает диапазон возможных значений. / (косая черта) Задает ступенчатые значения.У команды crontab установлен бит SGID (символ s вместо флага исполняемого файла для группы), что означает, что она выполняется с привилегиями группы (то есть crontab). Поэтому обычные пользователи могут редактировать свой crontab-файл с помощью команды crontab . Обратите внимание, что во многих дистрибутивах права доступа к файлам установлены таким образом, что crontab-файлы можно редактировать только с помощью команды crontab .
Системные crontabs задания
Системные crontabs — это текстовые файлы, которые управляют планированием системных заданий cron и могут быть отредактированы только пользователем с правами root.
/etc/crontab и файлы в каталоге /etc/cron.d являются системными crontabs.
В большинстве дистрибутивов также есть каталоги /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly и /etc/cron.monthly, в которых хранятся скрипты, запускаемые с определенной периодичностью. Например, если вы хотите запускать скрипт ежедневно, поместите его в /etc/cron.daily.
В некоторых дистрибутивах используются /etc/cron.d/hourly, /etc/cron.d/daily, /etc/cron.d/weekly и /etc/cron.d/monthly.
Синтаксис системных файлов crontab аналогичен синтаксису пользовательских файлов crontab, однако в нем есть дополнительное обязательное поле, в котором указывается пользователь, от имени которого будет выполняться задание cron.
Таким образом, каждая строка в системном файле crontab содержит семь полей, разделенных пробелами:
Минута часа (0–59). Час дня (0–23). День месяца (1–31). Месяц года (1–12). День недели (0–7, где воскресенье = 0 или 7). Имя учетной записи пользователя, которая будет использоваться при выполнении команды. Команда для выполнения.
Конкретные Временные характеристики
При редактировании файлов crontab вместо указания времени в первых пяти столбцах можно использовать специальные сочетания клавиш:
@reboot Запустите указанную задачу один раз после перезагрузки. @hourly Запускайте указанную задачу раз в час в начале каждого часа. @daily (или @midnight) Запускайте указанную задачу раз в день в полночь. @weekly Запускайте указанную задачу раз в неделю в полночь по воскресеньям. @monthly Запускайте указанную задачу раз в месяц в полночь первого числа. @yearly (или @annually) Запускайте указанную задачу раз в год в полночь 1 января.
Переменные Crontab
В файле crontab перед объявлением запланированных задач иногда указываются переменные. Обычно задаются следующие переменные среды:
HOME Каталог, в котором cron вызывает команды (по умолчанию — домашний каталог пользователя). MAILTO Имя пользователя или адрес, на который отправляется стандартный вывод и сообщения об ошибках (по умолчанию — владельцу crontab). Также допускается указание нескольких значений через запятую, а пустое значение означает, что письмо отправлять не нужно. PATH Путь, по которому можно найти команды. SHELL Оболочка для использования (по умолчанию /bin/sh).
По умолчанию команда crontab открывает редактор, указанный в переменных среды VISUAL или EDITOR
Рассмотрим следующие примеры записей в crontab:
0,15,30,45 08 * * 2 /home/frank/bar.sh
30 20 1-15 1,6 1-5 /home/frank/foobar.sh
В первой строке скрипт bar.sh выполняется каждый вторник в 08:00, 08:15, 08:30 и 08:45. Во второй строке скрипт foobar.sh выполняется в 20:30 с понедельника по пятницу в течение первых пятнадцати дней января и июня.
Помимо опции -e, упомянутой выше, у команды crontab есть и другие полезные параметры: -l Вывести текущий crontab на стандартный вывод. -r Удалите текущий файл crontab. -u Укажите имя пользователя, чей файл crontab необходимо изменить. Для этой опции требуются права суперпользователя. Она позволяет пользователю с правами суперпользователя редактировать файлы crontab других пользователей.
сли вы хотите запускать скрипт barfoo.sh, расположенный в каталоге /root, каждый день в 01:30, вы можете открыть /etc/crontab в предпочитаемом вами редакторе и добавить следующую строку:
30 01 * * * root /root/barfoo.sh >>/root/output.log 2>>/root/error.log
Настройка доступа к планированию заданий
В Linux файлы /etc/cron.allow и /etc/cron.deny используются для установки crontab ограничений.
В частности, с их помощью можно разрешить или запретить планирование заданий cron для разных пользователей
Если файл /etc/cron.allow существует, то только пользователи без прав root, перечисленные в нем, могут планировать задания cron с помощью команды crontab
Если файл /etc/cron.allow не существует, но существует файл /etc/cron.deny, то только пользователи без прав root, перечисленные в нем, не могут планировать задания cron с помощью команды crontab (в этом случае пустой /etc/cron.deny означает, что каждый пользователь может планировать задания cron с помощью crontab).
Файлы /etc/cron.allow и /etc/cron.deny содержат список имен пользователей, каждое из которых записано в отдельной строке.
Альтернатива Cron
Используя systemd в качестве системного и сервисного менеджера, вы можете настроить таймеры в качестве альтернативы cron для планирования задач.
Таймеры — это файлы модулей systemd с суффиксом .timer, и для каждого из них должен быть соответствующий файл модуля, описывающий модуль, который активируется по истечении времени таймера.
По умолчанию timer активирует службу с тем же именем, за исключением суффикса.
Таймер включает в себя раздел [Timer], в котором указывается, когда должны выполняться запланированные задания.
В частности, с помощью опции OnCalendar= можно задать таймеры реального времени, которые работают так же, как задания cron (на основе выражений для событий календаря). Для опции OnCalendar= требуется следующий синтаксис:
День недели Год-месяц-день Час:минута:секунда
DayOfWeek Year-Month-Day Hour:Minute:Second
DayOfWeek можно не указывать. Операторы *, / и , имеют то же значение, что и при использовании заданий cron, а .. между двумя значениями можно использовать для обозначения непрерывного диапазона. Для указания DayOfWeek можно использовать первые три буквы имени или полное имя.
Вы также можете настроить монотонные таймеры, которые активируются по истечении определенного времени с момента запуска (например, после загрузки компьютера или активации самого таймера).
Например, если вы хотите запускать службу с именем /etc/systemd/system/foobar.service в 05:30 в первый понедельник каждого месяца, вы можете добавить следующие строки в соответствующий файл модуля /etc/systemd/system/foobar.timer
[Unit]
Description=Запустить службу foobar
[Timer]
OnCalendar=Mon *-*-1..7 05:30:00
Persistent=true
[Install]
WantedBy=timers.target
После создания нового таймера вы можете включить его и запустить, выполнив следующие команды от имени пользователя root:
systemctl enable foobar.timer
systemctl start foobar.timer
Вы можете изменить периодичность выполнения запланированного задания, изменив значение OnCalendar и введя команду systemctl daemon-reload .
Если вы хотите просмотреть список активных таймеров, отсортированных по времени истечения, вы можете использовать команду systemctl list-timers . Вы также можете добавить параметр --all , чтобы увидеть неактивные таймеры.
Помните, что таймеры записываются в журнал systemd, и вы можете просматривать журналы различных модулей с помощью команды journalctl . Также помните, что если вы действуете как обычный пользователь, вам нужно использовать опцию --user команд systemctl и journalctl
Вместо более длинной нормализованной формы, описанной выше, можно использовать специальные выражения, описывающие определенные частоты выполнения заданий: hourly Запускайте указанную задачу раз в час в начале каждого часа. daily Запускайте указанную задачу раз в день в полночь. weekly Запускайте указанную задачу раз в неделю в полночь по понедельникам. monthly Запускайте указанную задачу раз в месяц в полночь первого числа. yearly Запускайте указанную задачу раз в год в полночь первого января. Полный список спецификаций по времени и дате можно найти на страницах руководства по адресу systemd.timer(5).
Пример заданий для crontab
crontab
@hourly 0 * * * * @daily 0 0 * * * @weekly 0 0 * * 0 @monthly 0 0 1 * * @annually 0 0 1 1 *
30 13 * * 1-5 В 13:30 каждый день с понедельника по пятницу 00 09-18 * * * Каждый день и каждый час с 09:00 до 18:00 30 08 1 1 * В 08:30 первого января 0,20,40 11 * * Sun Каждое воскресенье в 11:00, 11:20 и 11:40 00 09 10-20 1-3 * С 10 по 20 января, февраля и марта в 09:00 */20 * * * * Каждые двадцать минут
Пример заданий для OnCalendar
OnCalendar
hourly *-*-* *:00:00 daily *-*-* 00:00:00 weekly Mon *-*-* 00:00:00 monthly *-*-01 00:00:00 yearly *-01-01 00:00:00
*-*-* 08:30:00 Каждый день в 08:30 Sat,Sun *-*-* 05:00:00 В 05:00 утра в субботу и воскресенье *-*-01 13:15,30,45:00 В 13:15, 13:30 и 13:45 в первый день месяца Fri *-09..12-* 16:20:00 Каждую пятницу в 16:20 в сентябре, октябре, ноябре и декабре Mon,Tue *-*-1,15 08:30:00 В 08:30 первого или пятнадцатого числа каждого месяца, только если это понедельник или вторник *-*-* *:00/05:00 Каждые пять минут
Команда at
Команда at используется для однократного планирования задач и требует только указания времени, когда задание должно быть выполнено
После ввода at в командной строке и указания времени вы перейдете в командную строку at, где сможете задать команды для выполнения. Выйти из командной строки можно с помощью сочетания клавиш Ctrl+D
at 21:32
warning: commands will be executed using /bin/sh
at Sun Apr 12 21:32:00 2026
at>
at> echo "test" > test.txt
at>
job 5 at Sun Apr 12 21:32:00 2026
cat test.txt
test
#Запуск задания из файла
at 21:38 -f test.sh
warning: commands will be executed using /bin/sh
job 7 at Sun Apr 12 21:38:00 2026
#Список заданий
at -l
7 Sun Apr 12 21:38:00 2026 a chich
#Удаление заданий с помощью atrm
atrm 14
Наиболее важные параметры команды at:
-c Выводит команды с определенным идентификатором задания на стандартный вывод. -d Удаление заданий по их идентификатору. Это псевдоним для atrm. -f Считывайте задание из файла, а не со стандартного ввода. -l Выводит список ожидающих выполнения заданий пользователя. Если пользователь является администратором, выводятся все задания всех пользователей. Это псевдоним для atq. -m Отправьте пользователю письмо по завершении работы, даже если результат не был получен. -q Укажите очередь в виде одной буквы от a до z и от A до Z (по умолчанию a для at и b для batch). Задания в очередях с заглавными буквами выполняются с повышенным приоритетом. Задания, отправленные в очередь с заглавной буквы, считаются batch заданиями. -v Перед выполнением задания укажите время его выполнения.
Авторизация обычных пользователей для планирования at заданий определяется файлами /etc/at.allow и /etc/at.deny
Вы можете указать время выполнения определенного at задания в формате HH:MM, при необходимости добавив после него AM или PM в случае 12-часового формата
Если вы хотите запланировать выполнение задания на определенную дату, укажите ее после времени в одной из следующих форм: month-name day-of-month, month-name day-of-month year, MMDDYY, MM/DD/YY, DD.MM.YY и YYYY-MM-DD).
Также допустимы следующие ключевые слова: midnight, noon, teatime (16:00) и now со знаком плюс (+) и указанием периода времени (в минутах, часах, днях и неделях). Наконец, вы можете указать at для запуска задания сегодня или завтра, добавив к времени суффикс today или tomorrow. Например, вы можете использовать at 07:15 AM Jan 01 для запуска задания в 07:15 1 января и at now +5 minutes для запуска задания через пять минут. Дополнительную информацию о точном определении временных параметров можно найти в файле timespec в дереве /usr/share
Используя systemd в качестве системного и сервисного менеджера, вы также можете планировать выполнение разовых задач с помощью команды systemd-run . Обычно она используется для создания временного таймера, чтобы команда выполнялась в определенное время без необходимости создавать служебный файл. Например, от имени пользователя root вы можете запустить команду date в 11:30 6 октября 2019 года, выполнив следующие действия:
systemd-run --on-calendar='2019-10-06 11:30' date
Если вы хотите запустить скрипт foo.sh, расположенный в вашем текущем рабочем каталоге, через две минуты, используйте следующую команду:
systemd-run --on-active="2m" ./foo.sh
Помните, что таймеры записываются в журнал systemd, и вы можете просматривать журналы различных модулей с помощью команды journalctl . Также помните, что если вы действуете как обычный пользователь, вам нужно использовать опцию --user команд systemd-run и journalctl .
Используемые форматы времени для команды at
at 08:30 AM next week
at midday
at 01-01-2020 07:30 PM
at 21:50 01.01.20
at now +4 days
at 10:15 PM 31/03/2021
at tomorrow 08:30 AM monotonic
#задание, которое запустит foo.sh скрипт, расположенный в вашем домашнем каталоге, в 10:30 31 октября
at 10:30 AM October 31
#задание, которое запустит bar.sh скрипт завтра в 10:00
at 10:00 AM tomorrow
# задание, которое запускает foobar.sh скрипт через 30 минут
at now +30 minutes
#at задания всех пользователей
#от имени пользователя root, отображаются все ожидающие выполнения at задания всех пользователей
atq
#удалите все ожидающие выполнения at задания с помощью одной команды.
atrm 50 51 52
#
Обычно у at установлены биты SUID (символ s вместо флага исполняемого файла для владельца) и SGID (символ s вместо флага исполняемого файла для группы), что означает, что она выполняется с правами владельца и группы файла (daemon для обоих). Поэтому обычные пользователи могут планировать задания с помощью at.
После того как вы запланировали задание с помощью at, как можно просмотреть его команды?
Вы можете использовать команду at -c, указав после нее идентификатор задания, команды которого вы хотите просмотреть. Обратите внимание, что в выводе также содержится информация о большинстве переменных среды, которые были активны на момент планирования задания. Помните, что пользователь root может просматривать задания всех пользователей.
Источники
Здесь пока нет комментариев






