Планировщик задач Cron и команда crontab
Cron (Command Run ON) — это демон (фоновый процесс) в Unix-подобных операционных системах, предназначенный для выполнения заданий по расписанию, которые называются cron jobs.
Crontab (Cron table) — это файл, который содержит список заданий для демона cron. Каждый пользователь (включая root) может иметь свой собственный crontab-файл.
Основное применение:
- Автоматическое резервное копирование.
- Запуск скриптов для обработки данных.
- Обновление систем и пакетов.
- Очистка временных файлов и логов (например, с помощью logrotate).
- Отправка уведомлений и отчетов.
- Запуск задач для веб-приложений (например, отправка почтовых рассылок, инвалидация кеша).
Синтаксис crontab
Каждая строка в crontab-файле представляет собой отдельное задание и имеет следующую структуру:
# .---------------- минута (0 - 59)
# | .------------- час (0 - 23)
# | | .---------- день месяца (1 - 31)
# | | | .------- месяц (1 - 12) ИЛИ jan,feb,mar,apr ...
# | | | | .---- день недели (0 - 7) (Воскресенье=0 или 7) ИЛИ sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * пользователь (опционально, только в /etc/crontab) команда к выполнению
В личных crontab пользователя (редактируемых через crontab -e) поле пользователь не указывается.
Примеры:
- 0 * * * * /path/to/command - Выполнять команду каждый час, в начале часа (минута 0).
- */15 * * * * /path/to/command - Выполнять команду каждые 15 минут.
- 0 */1 * * * /path/to/command - Выполнять задание раз в час в 0 минут.
- 0 */7 * * * /path/to/command - Выполнять задание каждые семь часов в 0 минут.
- 0 2 * * * /path/to/command - Выполнять команду каждый день в 2:00 ночи.
- 0 2 * * 1 /path/to/command - Выполнять команду каждый понедельник в 2:00 ночи.
- 0 2 1 * * /path/to/command - Выполнять команду первого числа каждого месяца в 2:00 ночи.
- 0 2 1 1 * /path/to/command - Выполнять команду 1 января в 2:00 ночи.
- 7 18 13 5 5 /path/to/command - Выполнять задание в 18 часов 7 минут 13 мая если это пятница.
- 30 10 * * 0 /path/to/command - Выполнять задание по воскресеньям в 10 час 30 минут.
Допустимые значения временных параметров:
| Параметр |
Допустимый интервал |
| минуты |
0-59 |
| часы |
0-23 |
| день месяца |
1-31 |
| месяц |
1-12 |
| день недели |
0-7 (0-Вс,1-Пн,2-Вт,3-Ср,4-Чт,5-Пт,6-Сб,7-Вс) |
Поле может быть задано явно или шаблоном:
- * — любая цифра;
- целое число;
- целые числа через запятую — задание дискретного множества значений, например 1,2,5;
- два целых числа, разделенные дефисом, соответствующие диапазону значений, например 3-6.
Специальные символы и ключевые слова
- * (Звездочка): Любое допустимое значение. Например, * в поле "час" означает "каждый час".
- , (Запятая): Перечисление значений. 0,15,30,45 в поле "минуты" означает выполнение в 0, 15, 30 и 45-ю минуту часа.
- - (Дефис): Диапазон значений. 9-17 в поле "час" означает "каждый час с 9:00 до 17:00".
- / (Слеш): Шаг. */10 в поле "минуты" означает "каждые 10 минут". 0-23/2 в поле "час" означает "каждый четный час (0,2,4,...,22)".
- @reboot: Специальное ключевое слово для выполнения команды один раз при запуске системы. Очень полезно для старта служб или скриптов после перезагрузки. Например: @reboot /path/to/script.sh
Переменные окружения и пути
Cron выполняется в минимальном окружении. У него другой PATH и часто не заданы другие переменные, которые есть в вашем обычном shell (например, $HOME).
Всегда используйте полные абсолютные пути ко всему:
- К командам (/usr/bin/curl, а не просто curl)
- К скриптам (/home/user/scripts/backup.sh)
- К файлам вывода (/tmp/log.txt)
Управление заданиями
crontab -e отредактировать crontab текущего пользователя. Редактор по умолчанию — обычно vim или nano.
crontab -l показать содержимое crontab текущего пользователя.
crontab -r удалить весь crontab текущего пользователя. (Осторожно! Не спрашивает подтверждения).
crontab -u username -e отредактировать crontab указанного пользователя (требуются права root).
После сохранения изменений через crontab -e демон cron перезагружает конфигурацию автоматически, перезапускать службу cron (systemctl restart cron) не нужно.
Системные crontab-файлы
Помимо личных файлов пользователей, есть системные конфиги:
- /etc/crontab — главный системный crontab-файл. Его синтаксис отличается наличием поля пользователь между полем "день недели" и "команда".
Пример из /etc/crontab:
0 0 * * * root /path/to/system/backup.sh
- /etc/cron.d/ — директория, куда можно помещать отдельные файлы с заданиями (например, от пакетов — PHP, Docker и т.д.). Синтаксис такой же, как в /etc/crontab (с полем пользователь).
- /etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ — директории для скриптов, которые выполняются раз в час, день, неделю и месяц. За их запуск отвечает демон anacron (или cron), который проверяет эти папки. Просто положите исполняемый скрипт в нужную папку — и он запустится по расписанию.
Особенности использования и лучшие практики
- Всегда используйте абсолютные пути.
- Перенаправляйте вывод. По умолчанию cron шлет весь вывод (stdout и stderr) на email локальному пользователю. Если почта не настроена, письма могут загромождать очередь. Перенаправляйте вывод в файл или в /dev/null.
>/dev/null 2>&1 - Полное игнорирование всего вывода.
>> /path/to/logfile.log 2>&1 - Перенаправление всего вывода (включая ошибки) в файл, с дозаписью.
>> /path/to/logfile.log 2>> /path/to/errorfile.log - stdout в один файл, stderr в другой.
- Экранируйте знак процента %. В командной строке cron символ % имеет особое значение (перевод строки). Если вы используете date для формирования имени файла, экранируйте его обратным слэшем: date +\%Y\%m\%d.
- Пишите идиоматические скрипты. Выносите сложную логику в отдельный скрипт, а в cron вызывайте этот скрипт. Это проще отлаживать и поддерживать.
- Указывайте шебанг. В начале ваших скриптов всегда указывайте #!/bin/bash или #!/usr/bin/env python3.
- Делайте скрипты исполняемыми: chmod +x /path/to/script.sh.
- Тестируйте команды вручную. Перед добавлением в cron убедитесь, что команда работает из командной строки.
- Учитывайте время выполнения. Не ставьте два ресурсоемких задания на одно и то же время.
Выполнение PHP-файлов
Для выполнения php скриптов из cron необходим бинарный интерпретатора PHP.
Реальный путь на сервере к корневой директории сайта и путь к PHP уточните в службе поддержки хостинга.
# Пример запуска скрипта в 5 утра каждый день:
0 5 * * * /usr/bin/php -q /home/www/script.php
Обратите внимание, при запуске из cron опция -q указывает PHP не выдавать HTTP-заголовки.
Безопасность
- Файлы cron.deny и cron.allow. Они находятся в /etc/ (или /etc/cron.d/). Если cron.allow существует, то только пользователи, перечисленные в нем, могут использовать crontab. Если cron.allow не существует, но существует cron.deny, то все пользователи, кроме перечисленных в cron.deny, могут использовать crontab.
- Не запускайте задания от root без необходимости. Создавайте отдельного пользователя с минимально необходимыми привилегиями для выполнения конкретной задачи.
- Проверяйте содержимое системных папок /etc/cron.d/, /etc/cron.hourly/ и т.д. на наличие подозрительных заданий — это излюбленное место бэкдоров.