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

Что такое cron?

Планировщик задач Cron — один из главных компонентов Unix-систем. Его предназначение — запуск определенных скриптов и задач в нужное время с заданной регулярностью. 

Автоматизация Задач С Помощью Cron В Ubuntu (1)

Например, представим, что вам нужно делать ежедневный бэкап системы и базы данных. Каждый день запускать скрипт вручную не получится, к тому же не хочется днём нагружать систему ещё больше. Идеальный сценарий — запускать скрипт резервирования по ночам, при этом сохранять результаты в файл или уведомлять на служебную почту.

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

Установка cron

В большинстве Linux-дистрибутивов компонент Cron уже установлен по умолчанию. Но если в вашей системе это не так, это легко можно сделать вручную. Для этого сначала нужно обновить локальный индекс пакетов в системе, а затем установить непосредственно cron в Ubuntu.

sudo apt update
sudo apt install cron

Основная функция Cron — регулярное выполнение скриптов в фоновом режиме. Поэтому после установки нужно убедиться, что служба включена. Для этого воспользуемся диспетчером systemd.

sudo systemctl enable cron

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

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

Фактически все задачи записываются в файл /etc/crontab, в нём хранится и расписание, и непосредственно скрипты. Кроме этого, в файл можно добавлять служебные параметры — почту, оболочку, переменные среды и так далее. Задачи, добавленные каждым пользователем системы хранятся в /var/spool/cron/crontabs/

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

Для того, чтобы временно отключить выполнение задачи, достаточно просто закомментировать её с помощью символа # в начале строки.

Расписание

Расписание — это пять полей, разделённых пробелами: минута (0–59), час (0–23), день (1–31), месяц (1–12, jan — dec), день недели (0–6, sun— mon). Для того, чтобы задавать регулярность выполнения задач, существуют специальные символы, которые значительно упрощают постановку задач Cron.

  1. * — символ подстановки, он представляет все значения. То есть, если вместо конкретных минут написать *, тогда скрипт будет выполняться ежеминутно. 
  2. , используется для создания списка. Если нужно запускать скрипт два раза в сутки, не нужно создавать две записи. Вместо этого в поле «часы» достаточно написать, например, 5,10, и скрипт будет выполняться два раза — в пять и в десять часов.
  3. - — задаёт диапазон значений. Если по каким-то причинам вы хотите, чтобы ваш скрипт исполнялся только во второй половине недели, то достаточно написать в соответствующем поле 4-7.
  4. / обозначает шаг. Так, чтобы запускать скрипт каждые два часа в сутки, не нужно создавать 12 записей — достаточно просто написать */2. Но в качестве шага можно использовать только те числа, которые делят диапазон поровну, иначе скрипт не будет запускаться.

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

Примеры расписания:

  • * * * * * — каждую минуту
  • */15 2-12 * * * — каждые 15 минут, с 2 до 12 часов 
  • 30 23 * * * — каждый день в 23:30
  • 1,55 */12 * 1-6 * — в 1 и 55 минуту часа два раза в сутки, но только первые полгода.

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

  1. @reboot — задача выполняется только при загрузке системы, обычное расписание не предусматривает такой сценарий
  2. @yearly — задача выполняется один раз в год (синоним — @annualy)
  3. @monthly — скрипт запускается раз в месяц
  4. @daily — скрипт выполняется ежедневно (синоним — @midnight)
  5. @hourly — аналог запуску каждый час

Кроме того, в последних версиях Linux-дистрибутивов — в частности Ubuntu 20.04 — помимо задач приписан ещё и запуск утилиты run-parts. Эта утилита отвечает за выполнение скриптов из следующих каталогов:

  • /etc/cron.minutely — скрипты, которые должны выполняться каждую минуту
  • /etc/cron.hourly — скрипты, которые должны выполняться каждый час
  • /etc/cron.daily — скрипты, которые должны выполняться ежедневно
  • /etc/cron.weekly — скрипты, которые должны выполняться каждую неделю
  • /etc/cron.monthly — скрипты для ежемесячного запуска.

В файле /etc/crontab использование утилиты run-parts не отличается от обычных задач и выглядит примерно так: 

# run-parts
01 * * * * root run-parts /etc/cron.hourly
01 23 * * * root run-parts /etc/cron.daily
0 23 * * 0 root run-parts /etc/cron.weekly
20 23 * * * root run-parts /etc/cron.monthly

Для тех, кто только начинает знакомиться с синтаксисом планировщика crontab, советуем при создании записей пользоваться сервисом crontab.guru. Вы также можете настраивать задачи в панели cloud.timeweb.com или обратиться в службу поддержки — наши специалисты помогут вам и проконсультируют, если возникнут сложности.

Запуск скрипта

С помощью демона Cron вы можете исполнять любые скрипты так, будто вы находитесь в консоли. Например, для того, чтобы регулярно писать строку в файл, просто добавьте к расписанию команду для выполнения. Получится такое cron-выражение:

* * * * * /bin/echo "test string" >> /home/user/cron.log

Но если вам нужно, чтобы скрипт выполнялся в фоне, нужно перенаправить его вывод в пустую директорию /dev/null. Представим, что нам нужно регулярно обрабатывать таблицу с транзакциями, чтобы проверять статусы платежей пользователей. Для этого у нас написан скрипт на PHP. Тогда в cron добавим следующую запись

*/10 * * * * /usr/bin/php /var/www/example.com/billing/proccessing-handler.php > /dev/null

В этой строке cron каждые 10 минут исполняет php-скрипт processing-handler.php, но сохраняет только ошибки. 

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

Расписание Cron

Как запланировать задачи в Ubuntu

Хоть crontab — это просто файл, изменять его напрямую не рекомендуется. Вместо этого нужно использовать команду crontab -e. Это позволит избежать ошибок синтаксиса или проблем с правами на файл. Настройка cron — по сути и есть просто редактирование файла с помощью вашего любимого текстового редактора, его вы сможете выбрать при первом запуске или с помощью команды select-editor.

В появившемся окне внесите своё расписание задач, каждое с новой строки. Продолжая пример со скриптом-обработчиком транзакций, добавим нужное задание в crontab. После добавления всех необходимых строк просто сохраняем изменения и закрываем редактор. Задача начала регулярно выполняться.

Пример Файла Cron

Для того, чтобы посмотреть, какие задачи выполняются, нужно прочитать файл. Существует много способов посмотреть содержимое файла —с помощью любого текстового редактора, команды cat или crontab -e. Но помимо этого вы можете воспользоваться специальной командой crontab -l.

Удалить файл можно командой crontab -ri. Флаг i очень важен, он запрашивает ваше подтверждение перед безвозвратным удалением файла. Если выполнить команду без него, файл удалится сразу.

Проверить результат работы cron

Демон Cron по умолчанию будет уведомлять вас о результатах работы скрипта на почту, которую вы указали при создании профиля. Помимо этого вы можете настроить отправку результатов себе на другой электронный адрес, сохранять результаты в журнал вывода cron или ничего с ними не делать.

Уведомления на почту

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

Адрес электронной почты задаётся в начале файла crontab c помощью оператора MAILTO. Ниже — пример выдуманной задачи по очистке логов, её результат приходит на почту cloud@timeweb.com.

MAILTO = "cloud@timeweb.com"
0 1 * * * /bin/bash /remove-log.sh

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

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

С помощью оператора > нужно направить вывод в файл журнала — всё, в том числе ошибки, окажется в лог-файле. 

*/20 * * * * rm -r /home/user/cache > /home/user/reports/cron-rm-cache.log

Отключить вывод

Когда скрипт ничего не выводит и просто исполняется в фоне, мы можем вообще отключить уведомления и журналирование. Для этого перенаправляем результат в уже знакомую нам пустую директорию /dev/null. Туда же — вывод ошибок, для этого добавляем конструкцию 2>&1, где 2 — стандартная ошибка, stderr, а &1 — вывод по умолчанию, то есть в нашем случае /dev/null.

30 2,6 * * * /usr/bin/php /var/www/logout-bots.php > /dev/null 2>&1

Но даже если вывод результатов отключён, можно проверить, работает ли скрипт, в журнале syslog. Отыщите там слово CRON с помощью команды grep

grep CRON /var/log/syslog

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

Telegram
VK
Скопировать ссылку
Как использовать Axios в React
Как использовать Axios в React
Как пользоваться SSH
Как пользоваться SSH

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону