Раздел помощи SpaceWeb

Автоматизация задач с помощью cron в Ubuntu 18.04

10 авг, 2024

Автоматизация задач – важный элемент эффективного администрирования серверов. В Ubuntu 18.04 (как и в других дистрибутивах Linux) для этого часто используется cron – система планирования задач. 

В этой статье мы рассмотрим, как настроить cron, чтобы автоматизировать различные задачи на вашем сервере.

Что такое cron

Cron – это системный демон в Unix-подобных операционных системах, благодаря которому можно автоматизировать выполнение задач по расписанию. Он позволяет пользователям запускать команды или скрипты в конкретное время или через определенные интервалы времени.

Cron использует таблицы, чтобы определять, какие задачи и когда должны быть выполнены.

Как работает cron

Для управления задачами cron использует специальные файлы, которые называются crontab (сокращение от «cron table»). У каждого пользователя системы может быть личный файл crontab, в котором перечислены команды и время их выполнения. 

Когда система загружается, cron запускается как фоновый процесс и периодически проверяет файлы crontab, чтобы узнать, не пришло ли время для выполнения какой-либо задачи. Если время выполнения совпадает с текущим временем, cron запускает соответствующую команду. 

Основной файл настройки cron – это /etc/crontab. В нем записываются все задачи cron, а также расписание их выполнения. В каждой строке этого файла содержится информация о том, когда и какие команды или скрипты должны выполняться. Помимо этого, в файл можно добавлять служебные параметры, такие как почтовый адрес для отправки результатов выполнения задач, используемую оболочку и переменные среды. Например, вы можете указать, что результаты выполнения всех задач нужно отправлять на определенный электронный адрес. Такая возможность очень полезна для мониторинга и диагностики.

Каждый пользователь системы может создавать свои собственные задачи cron. Они хранятся в отдельных файлах в директории /var/spool/cron/crontabs/. Так каждый пользователь системы может управлять своими задачами независимо от других пользователей. Например, если у вас есть несколько пользователей на сервере, каждый из них может настроить crontab, чтобы автоматизировать свои задачи, не влияя на задачи других пользователей.

Синтаксис crontab

Каждое задание в crontab добавляется с новой строки. Строка состоит из двух частей: настроек расписания и непосредственно команды или скрипта. 

Как выглядит общий синтаксис:

[минута] [час] [день_месяца] [месяц] [день_недели] [команда]

Расписание

Как мы уже указали ранее, расписание в crontab состоит из пяти полей, разделённых пробелами:

  • Минута (возможные значения: 0–59). Указывает, в какую минуту часа должна выполняться задача.
  • Час (возможные значения: 0–23). Указывает, в какой час должна выполняться задача.
  • День месяца (возможные значения: 1–31). Указывает, в какой день месяца должна выполняться задача.
  • Месяц (возможные значения: 1–12, jan – dec). Указывает, в каком месяце должна выполняться задача.
  • День недели (возможные значения: 0–6, sun – mon). Указывает, в какой день недели должна выполняться задача.

Чтобы задать регулярность выполнения задач, используются специальные символы:

  • «*» – символ подстановки, который представляет все значения. Например, если в поле минут стоит *, задача будет выполняться каждую минуту. 
  • «,» помогает создать список значений. Например, «1,8» в поле часов задает выполнение задачи в 1 и 8 часов. Этот символ позволяет задать несколько временных точек для одной задачи без необходимости создавать несколько записей.
  • «-» задаёт диапазон значений. Например, 1-5 в поле дней недели означает выполнение задачи с понедельника по пятницу. 
  • «/» обозначает шаг. Например, */5 в поле часов означает выполнение задачи каждые пять часов. Этот символ позволяет задать регулярные интервалы выполнения задачи, что значительно упрощает настройку периодических задач.

Примеры:

Чтобы лучше понять гибкость и мощность cron, рассмотрим несколько дополнительных примеров расписания. Они помогут вам увидеть, как можно настроить выполнение задач в зависимости от ваших конкретных потребностей:

  1. Выполнять задачу дважды в день – в 8:00 и 18:00 вечера:
0 8,18 * * * 

  1. Выполнять задачу по понедельникам в 9:00 утра:
0 9 * * 1 

  1. Выполнять задачу 1-го числа каждого месяца в полночь:
0 0 1 * * 

  1. Выполнять задачу каждые 10 минут с 9:00 до 18:00 с понедельника по пятницу:
*/10 9-18 * * 1-5 

  1. Выполнять задачу каждую минуту:
* * * * *

Специальные символы Cron

Чтобы упростите создание расписания, в cron предусмотрены часто используемые переменные:

  • «@reboot» указывает выполнять задачу при загрузке системы. 
  • «@yearly» или «@annually» указывает, что задача должна выполняться раз в год. Аналог: 0 0 1 1 *. 
  • «@monthly» – указывает, что задача должна выполняться раз в месяц. Аналог: 0 0 1 * *. 
  • «@daily» или «@midnight» указывает выполнение задачи ежедневно. Аналог: 0 0 * * *. 
  • «@hourly» – задает выполнение задачи каждый час. Аналог: 0 * * * *. 

Установка cron 

В большинстве современных дистрибутивов cron уже включен в базовую систему, но, если по какой-то причине он отсутствует, его можно установить через пакетный менеджер.

Прежде чем устанавливать cron, полезно убедиться, что он не установлен на системе. Это можно сделать, выполнив команду:

crontab -l

Если cron установлен, команда покажет текущий список задач или сообщит, что crontab отсутствует для текущего пользователя. Если cron не установлен, будет выдано сообщение об ошибке. Например:

no crontab for johndoe

Перед началом установки рекомендуется обновить список доступных пакетов и их версий. Для этого пропишите:

sudo apt update

Эта команда обновит локальную базу данных пакетов, что позволит установить самые последние версии программ.

Чтобы установить cron, выполните следующую команду:

sudo apt install cron

Ubuntu запросит подтверждение установки, после чего начнется процесс загрузки и установки пакета cron. Обычно это занимает всего несколько секунд.

Когда установка завершится, убедитесь, что служба cron запущена и работает корректно. Для этого введите:

sudo systemctl status cron

Если cron запущен, вы увидите сообщение, что служба активна – «active (running)».

Чтобы служба cron автоматически запускалась при загрузке системы, выполните команду:

sudo systemctl enable cron

Управление файлами crontab 

Когда вы определились с расписанием задач и узнаете, какие задачи хотите запланировать, можно будет перейти к следующему шагу – поместить их в файл crontab, чтобы демон cron смог их прочитать и выполнить в указанное время. 

Важно понимать, что crontab – это специальный файл, который содержит расписание задач для cron, но непосредственно редактировать его не рекомендуется. Вместо этого существует команда crontab, которая облегчает работу с этим файлом и предотвращает возможные ошибки.

Чтобы отредактировать файл crontab, используйте команду:

crontab -e

Если вы запускаете эту команду впервые от имени текущего пользователя, система предложит вам выбрать текстовый редактор по умолчанию. 

В зависимости от настроек, вы можете увидеть следующий вывод:

no crontab for user - using an empty one
Select an editor.  To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]:

Введите номер, соответствующий редактору, который вы хотите использовать. Чтобы выбрать редактор по умолчанию (как правило, это nano), просто нажмите ENTER.

После этого откроется новый файл crontab, который может содержать комментарии с инструкциями по его использованию. Теперь вы можете добавить в него расписание своих задач. Главное – не забывайте прописывать каждую на отдельной строке. 

Чтобы сохранить и закрыть файл crontab, используйте подходящую комбинацию клавиш, в зависимости от выбранного редактора. В nano зажмите CTRL+X, а затем введите Y и нажмите Enter, чтобы подтвердить внесенные изменения.

Просмотр и удаление crontab

Если вы хотите просто просмотреть содержимое своего crontab, не редактируя его, используйте команду:

crontab -l

Эта команда выведет текущий файл crontab пользователя, позволяя увидеть все запланированные задачи.

Иногда возникает необходимость очистить crontab, удалив все задачи. Для этого можно использовать команду:

crontab -r

Важно! Будьте внимательны, эта команда немедленно удалит файл crontab. 

Если вы хотите, чтобы команда запрашивала подтверждение перед удалением, используйте флаг -i:

crontab -r -i

Результат:

crontab: really delete user's crontab? (y/n)

Введите y, чтобы удалить crontab, или n, чтобы отменить действие.

Чтобы временно отключить выполнение задачи, достаточно закомментировать строку, добавив символ # в начале. Это полезный способ, если вам нужно временно прекратить выполнение задачи, но вы не хотите удалять запись из crontab, чтобы затем восстанавливать её.

Управление выводом cron 

Поскольку задачи cron выполняются в фоновом режиме, их результаты не всегда очевидны и доступны пользователю. Теперь, когда вы знаете, как использовать команду crontab и как планировать задачи в cron, стоит разобраться с несколькими способами перенаправления вывода cron. Так вы сможете отслеживать их выполнение и получать необходимую информацию о работе ваших скриптов.

Уведомления по электронной почте

Один из способов отслеживания выполнения задач cron – перенаправление их вывода на электронную почту. Если на вашем сервере установлен и настроен почтовый агент (например, Sendmail), вы можете автоматически получать результаты выполнения задач на адрес электронной почты, который связан с вашей учетной записью пользователя Linux.

Чтобы указать другой адрес электронной почты, на который должны приходить результаты выполнения задач, можно использовать параметр MAILTO в начале файла crontab. 

Например, если вы хотите получать уведомления на почту admin@example.ru, ваш файл crontab может выглядеть следующим образом:

MAILTO="admin@example.ru"
0 4 * * * /usr/local/bin/backup.sh

Теперь cron будет запускать резервное копирование данных ежедневно в 4:00 утра, а затем отправлять свой вывод на указанный адрес электронной почты. Такой способ особенно удобен для мониторинга и быстрого реагирования на ошибки или важные события.

Уведомления в журнал

Сохранение результатов работы фоновых скриптов в журнал считается хорошей практикой, особенно для часто выполняемых задач. Если выполнение задачи прервалось, отчет об этой ситуации может потеряться в почте, а лог-файл всегда можно проанализировать, найти ошибки и исправить скрипт.

Чтобы перенаправить вывод задачи cron в лог-файл можно использовать оператор >. 

Например:

*/15 * * * * /usr/bin/python3 /home/user/scripts/data_cleanup.py > /var/log/cron_data_cleanup.log 2>&1

Скрипт очистки данных будет выполнять каждые 15 минут, а его вывод записываться в лог-файл /var/log/cron_data_cleanup.log. Такой подход поможет вам сохранить всю важную информацию о выполнении задачи, включая возникнувшие ошибки.

Отключение вывода

Возможно, вам не нужны результаты выполнения задачи cron. Если скрипт не выводит никакой информации и просто выполняется в фоновом режиме, можно полностью отключить уведомления и журналирование. 

Для этого перенаправьте вывод в пустую директорию /dev/null:

30 5 * * * /usr/local/bin/update_stats.sh > /dev/null 2>&1

В этом примере задача запускается ежедневно в 5:30 утра, а её вывод, включая ошибки, перенаправляется в /dev/null. Здесь «2>&1» означает, что стандартный вывод ошибок также перенаправляется в /dev/null.

Проверка работы скриптов

Даже если вывод результатов выполнения задач отключён, вы все равно можете проверить, работают ли ваши скрипты, через журнал syslog. 

Чтобы найти записи, которые связаны с cron, используйте команду grep:

grep CRON /var/log/syslog

Если задача cron выполняется корректно, вы увидите соответствующие записи в syslog. Например, вы можете увидеть записи о запуске задач и любых возникающих ошибках. 

Заключение

Автоматизация задач с помощью cron в Ubuntu 18.04 – это полезный и гибкий инструмент для системных администраторов и пользователей. С помощью cron можно легко настроить выполнение регулярных задач, включая резервное копирование, очистку данных и мониторинг системы. Он значительно повышает эффективность управления сервером.