Планировщик задач Cron — один из главных компонентов Unix-систем. Его предназначение — запуск определенных скриптов и задач в нужное время с заданной регулярностью.
Например, представим, что вам нужно делать ежедневный бэкап системы и базы данных. Каждый день запускать скрипт вручную не получится, к тому же не хочется днём нагружать систему ещё больше. Идеальный сценарий — запускать скрипт резервирования по ночам, при этом сохранять результаты в файл или уведомлять на служебную почту.
Для этого и подобных сценариев в Linux существует автоматизация задач, за которую отвечает специальный компонент-планировщик Cron. Пользователю достаточно только добавить нужный скрипт и указать регулярность выполнения. По умолчанию результаты отправляются на почту, но также их можно записывать в файл-журнал или вовсе никуда не выводить.
В большинстве Linux-дистрибутивов компонент Cron уже установлен по умолчанию. Но если в вашей системе это не так, это легко можно сделать вручную. Для этого сначала нужно обновить локальный индекс пакетов в системе, а затем установить непосредственно cron в Ubuntu.
sudo apt update
sudo apt install cron
Основная функция Cron — регулярное выполнение скриптов в фоновом режиме. Поэтому после установки нужно убедиться, что служба включена. Для этого воспользуемся диспетчером systemd.
sudo systemctl enable cron
Теперь cron установлен и запущен для каждого пользователя системы. Осталось разобраться, как планировать задачи в cron.
Фактически все задачи записываются в файл /etc/crontab, в нём хранится и расписание, и непосредственно скрипты. Кроме этого, в файл можно добавлять служебные параметры — почту, оболочку, переменные среды и так далее. Задачи, добавленные каждым пользователем системы хранятся в /var/spool/cron/crontabs/.
Каждое задание добавляется с новой строки, а для того, чтобы задать расписание, используется специальный несложный синтаксис. Строка условно делится на две части — настройки регулярности выполнения и непосредственно скрипт.
Для того, чтобы временно отключить выполнение задачи, достаточно просто закомментировать её с помощью символа # в начале строки.
Расписание — это пять полей, разделённых пробелами: минута (0–59), час (0–23), день (1–31), месяц (1–12, jan — dec), день недели (0–6, sun— mon). Для того, чтобы задавать регулярность выполнения задач, существуют специальные символы, которые значительно упрощают постановку задач Cron.
*
— символ подстановки, он представляет все значения. То есть, если вместо конкретных минут написать *, тогда скрипт будет выполняться ежеминутно. ,
используется для создания списка. Если нужно запускать скрипт два раза в сутки, не нужно создавать две записи. Вместо этого в поле «часы» достаточно написать, например, 5,10, и скрипт будет выполняться два раза — в пять и в десять часов.-
— задаёт диапазон значений. Если по каким-то причинам вы хотите, чтобы ваш скрипт исполнялся только во второй половине недели, то достаточно написать в соответствующем поле 4-7./
обозначает шаг. Так, чтобы запускать скрипт каждые два часа в сутки, не нужно создавать 12 записей — достаточно просто написать */2. Но в качестве шага можно использовать только те числа, которые делят диапазон поровну, иначе скрипт не будет запускаться.
Примеры расписания:
* * * * *
— каждую минуту*/15 2-12 * * *
— каждые 15 минут, с 2 до 12 часов 30 23 * * *
— каждый день в 23:301,55 */12 * 1-6 *
— в 1 и 55 минуту часа два раза в сутки, но только первые полгода.Чтобы упростить процесс создания задач, в последних версиях современных дистрибутивов в компоненте Cron предусмотрены самые частые наборы переменных расписания:
Кроме того, в последних версиях Linux-дистрибутивов — в частности Ubuntu 20.04 — помимо задач приписан ещё и запуск утилиты run-parts. Эта утилита отвечает за выполнение скриптов из следующих каталогов:
В файле /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. Вы также можете настраивать задачи в панели timeweb.cloud или обратиться в службу поддержки — наши специалисты помогут вам и проконсультируют, если возникнут сложности.
vds
С помощью демона 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 запись была сделана рядовым пользователем.
Хоть crontab — это просто файл, изменять его напрямую не рекомендуется. Вместо этого нужно использовать команду crontab -e
. Это позволит избежать ошибок синтаксиса или проблем с правами на файл. Настройка cron — по сути и есть просто редактирование файла с помощью вашего любимого текстового редактора, его вы сможете выбрать при первом запуске или с помощью команды select-editor.
В появившемся окне внесите своё расписание задач, каждое с новой строки. Продолжая пример со скриптом-обработчиком транзакций, добавим нужное задание в crontab. После добавления всех необходимых строк просто сохраняем изменения и закрываем редактор. Задача начала регулярно выполняться.
Для того, чтобы посмотреть, какие задачи выполняются, нужно прочитать файл. Существует много способов посмотреть содержимое файла —с помощью любого текстового редактора, команды cat или crontab -e. Но помимо этого вы можете воспользоваться специальной командой crontab -l
.
Удалить файл можно командой crontab -ri
. Флаг i очень важен, он запрашивает ваше подтверждение перед безвозвратным удалением файла. Если выполнить команду без него, файл удалится сразу.
Демон 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
Если в результате вы увидите процесс исполнения команд, значит всё настроено верно, и скрипт работает. Если что-то пошло не так, там же будут выведены ошибки.
Выгодные тарифы на VDS/VPS
Мы рассмотрели, как установить cron на сервер с Ubuntu и настроить выполнение задач по расписанию.