- Автоматизация задач с помощью cron в Ubuntu 18.04
- Установка cron
- Как работает cron?
- Расписание
- Запуск скрипта
- Как запланировать задачи в Ubuntu
- Проверить результат работы cron
- Уведомления на почту
- Уведомления в журнал
- Отключить вывод
- cron
- Листинг
- Основные настройки
- Не обязательные настройки
- Выбор времени выполнения задания
- Дополнительные переменные cron
- Управление при помощи crontab
- Примеры
- GUI версии
- GTK+
- KDE
Автоматизация задач с помощью cron в Ubuntu 18.04
Планировщик задач Cron — один из главных компонентов Unix-систем. Его предназначение — запуск определенных скриптов и задач в нужное время с заданной регулярностью.
Например, представим, что вам нужно делать ежедневный бэкап системы и базы данных. Каждый день запускать скрипт вручную не получится, к тому же не хочется днём нагружать систему ещё больше. Идеальный сценарий — запускать скрипт резервирования по ночам, при этом сохранять результаты в файл или уведомлять на служебную почту.
Для этого и подобных сценариев в 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.
- * — символ подстановки, он представляет все значения. То есть, если вместо конкретных минут написать * , тогда скрипт будет выполняться ежеминутно.
- , используется для создания списка. Если нужно запускать скрипт два раза в сутки, не нужно создавать две записи. Вместо этого в поле «часы» достаточно написать, например, 5 , 10 , и скрипт будет выполняться два раза — в пять и в десять часов.
- — — задаёт диапазон значений. Если по каким-то причинам вы хотите, чтобы ваш скрипт исполнялся только во второй половине недели, то достаточно написать в соответствующем поле 4 — 7 .
- / обозначает шаг. Так, чтобы запускать скрипт каждые два часа в сутки, не нужно создавать 12 записей — достаточно просто написать */ 2 . Но в качестве шага можно использовать только те числа, которые делят диапазон поровну, иначе скрипт не будет запускаться.
- * * * * * — каждую минуту
- */ 15 2 — 12 * * * — каждые 15 минут, с 2 до 12 часов
- 30 23 * * * — каждый день в 23:30
- 1 , 55 */ 12 * 1 — 6 * — в 1 и 55 минуту часа два раза в сутки, но только первые полгода.
Чтобы упростить процесс создания задач, в последних версиях современных дистрибутивов в компоненте Cron предусмотрены самые частые наборы переменных расписания:
- @reboot — задача выполняется только при загрузке системы, обычное расписание не предусматривает такой сценарий
- @yearly — задача выполняется один раз в год (синоним — @annualy )
- @monthly — скрипт запускается раз в месяц
- @daily — скрипт выполняется ежедневно (синоним — @midnight )
- @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 запись была сделана рядовым пользователем.
Как запланировать задачи в Ubuntu
Хоть crontab — это просто файл, изменять его напрямую не рекомендуется. Вместо этого нужно использовать команду crontab -e . Это позволит избежать ошибок синтаксиса или проблем с правами на файл. Настройка cron — по сути и есть просто редактирование файла с помощью вашего любимого текстового редактора, его вы сможете выбрать при первом запуске или с помощью команды select-editor.
В появившемся окне внесите своё расписание задач, каждое с новой строки. Продолжая пример со скриптом-обработчиком транзакций, добавим нужное задание в crontab. После добавления всех необходимых строк просто сохраняем изменения и закрываем редактор. Задача начала регулярно выполняться.
Для того, чтобы посмотреть, какие задачи выполняются, нужно прочитать файл. Существует много способов посмотреть содержимое файла —с помощью любого текстового редактора, команды 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 .
Если в результате вы увидите процесс исполнения команд, значит всё настроено верно, и скрипт работает. Если что-то пошло не так, там же будут выведены ошибки.
cron
cron – программа-демон, предназначенная для выполнения заданий в определенное время, или через определенные промежутки времени. Для редактирования заданий используется утилита crontab .
Листинг
Нельзя изменять файл расписания, просто открыв его в текстовом редакторе. Для его редактирования необходимо использовать команду crontab -e .
Простой пример файла расписания. Создание снимка экрана каждый час:
SHELL=/bin/bash MAILTO=username 0 * * * * scrot
Основные настройки
Выбор среды для исполняемых задач:
Имя пользователя, которому будет послано сообщение о выполнении задания:
Вместо имени, также можно использовать электронный адрес:
Не обязательные настройки
Задаем каталог пользователя:
Задаем каталоги исполняемых фалов:
Прописываем дисплей, если запускаемый по крону скрипт должен использовать графику:
Выбор времени выполнения задания
Время запуска представляется в таком виде:
минута час день_месяца месяц день_недели команда
Значение | Диапазон | Дополнительно |
---|---|---|
минуты | 0-59 | |
часы | 0-23 | |
дни месяца | 1-31 | |
месяцы | 1-12 | можно задавать и в 3-х буквенном варианте |
дни недели | 0-6 | можно задавать и в 3-х буквенном варианте (0=воскресенье) |
Символ ‘*’ подразумевает — любое значение.
Минимальное время 1-а минута. Это связано с тем что cron каждую минуту просматривает список заданий, и ищет которые нужно выполнить.
Дни недели и месяца в трех буквенном варианте: |
---|
sun mon tue wed thu fri sat |
jan feb mar apr may jun jul aug sep oct nov dec |
Дополнительные переменные cron
Переменная | Описание | Эквивалент |
---|---|---|
@reboot | Запуск при загрузке | |
@yearly | Раз в год | 0 0 1 1 * |
@annually | Тоже что и @yearly | |
@monthly | Раз в месяц | 0 0 1 * * |
@weekly | Раз в неделю | 0 0 * * 0 |
@daily | Раз в день | 0 0 * * * |
@midnight | В полночь (00:00) | |
@hourly | Каждый час | 0 * * * * |
Управление при помощи crontab
Добавление файла расписания:
crontab имя_файла_расписания
Вывести содержимое текущего файла расписания:
Удаление текущего файла расписания:
Редактирование текущего файла расписания (при первом запуске будет выведен список поддерживаемых текстовых редакторов):
Этот ключ позволяет выполнять вышеописанные действия для конкретного пользователя:
Учтите, что -u можно воспользоваться только запуская crontab от лица суперпользователя.
Примеры
Каждый час, с использованием переменных cron:
Каждый день в 03:15 запускать скрипт:
Тоже что и выше, но расписанное полностью:
Новый год :
Каждый будний день в 22:00:
Запуск программы с графической оболочкой ( GUI ); каждую минуту будет отображаться сообщение с текстом «It work!»:
0-59 * * * * DISPLAY=:0 gdialog --msgbox "It work\!" 25 20 > /dev/null
* где DISPLAY=:0 — номер монитора
GUI версии
GTK+
Есть очень полезная программа: Scheduled tasks(gnome-schedule). Она представляет собой графический интерфейс для cron, и будет полезна новичкам, так как понятным языком описывает время выполнения задачи. К примеру:
каждую минуту, между 00:00 и 00:59.
KDE
Для KDE существует Task Scheduler, который встраивается в окно настройки системы.