Введение
Cron — это классический планировщик задач в Unix-подобных системах, который позволяет автоматически запускать команды и скрипты по расписанию. С его помощью можно настроить регулярные операции: создание резервных копий, очистка временных файлов, отправку отчётов и многое другое. В этом руководстве вы освоите основы cron: синтаксис, создание заданий, отладку и типичные сценарии использования. После выполнения вы сможете самостоятельно настраивать автоматизацию в Linux.
Требования
Перед началом убедитесь, что:
- У вас есть доступ к терминалу Linux (локально или через SSH).
- Установлен демон cron (обычно предустановлен в большинстве дистрибутивов). В Debian/Ubuntu это пакет
cron, в CentOS/Fedora —cronie. - У вас есть права на выполнение задач (cron работает в контексте текущего пользователя).
- Для тестирования подготовьте простой скрипт, например
~/test.shс содержимым:
Не забудьте сделать его исполняемым:#!/bin/bash echo "Cron работает: $(date)" >> /tmp/cron_test.logchmod +x ~/test.sh.
Пошаговая инструкция
Шаг 1: Понимание формата crontab
Файл crontab (таблица заданий cron) состоит из строк, каждая из которых определяет расписание и команду. Формат:
минуты часы день_месяца месяц день_недели команда
- Минуты: 0–59.
- Часы: 0–23.
- День месяца: 1–31.
- Месяц: 1–12.
- День недели: 0–7 (0 и 7 — воскресенье).
- Команда: путь к скрипту или команда с аргументами.
Специальные символы:
*— любое значение.*/N— шаг (например,*/15в минутах — каждые 15 минут).,— перечисление (например,0,30— в 0 и 30 минут).-— диапазон (например,1-5— с понедельника по пятницу).@reboot— выполнить при загрузке системы.
Примеры:
0 * * * * /path/to/script.sh— каждый час в 0 минут.30 3 * * 1-5 /backup.sh— в 3:30 с понедельника по пятницу.0 0 1 * * /cleanup.sh— в 00:00 1-го числа каждого месяца.
Шаг 2: Редактирование crontab
Каждый пользователь имеет свой crontab. Чтобы отредактировать его:
- В терминале выполните:
crontab -e - При первом запуске система может спросить, какой редактор использовать (nano или vim). Рекомендуем выбрать
nanoдля простоты. - Откроется текстовый файл (возможно пустой). Это и есть ваш crontab.
💡 Совет: Если вы хотите редактировать crontab другого пользователя (например, root), используйте
sudo crontab -e. Но будьте осторожны — задания от root выполняются с привилегиями суперпользователя.
Шаг 3: Добавление задания
В открытом редакторе:
- Перейдите в конец файла.
- Добавьте строку с заданием. Например, чтобы запускать скрипт
~/backup.shкаждый день в 2:30 ночи:30 2 * * * /home/ваш_пользователь/backup.sh - Убедитесь, что путь к скрипту абсолютный (начинается с
/). Cron не использует переменнуюPATHиз вашего shell, поэтому указывайте полные пути ко всем исполняемым файлам внутри скрипта.
⚠️ Важно: Не добавляйте лишние символы (пробелы, табуляции) в начале строки. Cron терпимо относится к пробелам после полей, но лучше писать без них.
Шаг 4: Проверка и управление заданиями
После сохранения файла cron автоматически загружает новую конфигурацию. Чтобы убедиться, что задание добавлено:
- Выполните
crontab -l— вы увидите список всех заданий текущего пользователя. - Чтобы удалить задание, снова откройте crontab (
crontab -e) и удалите соответствующую строку. - Чтобы полностью очистить crontab текущего пользователя:
crontab -r(будьте осторожны, это необратимо!).
Для управления заданиями других пользователей (только root) используйте:
sudo crontab -l -u username # посмотреть задания пользователя
sudo crontab -e -u username # редактировать задания пользователя
Шаг 5: Отладка и логи
Если задание не выполняется, ищите причину в логах:
- Проверьте статус службы cron:
systemctl status cron # Debian/Ubuntu systemctl status crond # CentOS/Fedora
Служба должна быть активной (active (running)). - Просмотрите логи cron. Обычно они пишутся в системный лог:
grep CRON /var/log/syslog # Debian/Ubuntu grep CRON /var/log/cron # CentOS/Fedora
Или через journalctl:journalctl -u cron -f # следить за логами в реальном времени journalctl -u crond -f # для CentOS/Fedora - Проверьте вывод команды. По умолчанию cron отправляет любой вывод (stdout и stderr) на email пользователю (локальному). Чтобы перехватить его, добавьте перенаправление в файл:
* * * * * /path/to/script.sh >> /tmp/script.log 2>&1
Так вы сохраните и стандартный вывод, и ошибки. - Убедитесь в правах на скрипт. Скрипт должен быть исполняемым:
chmod +x /path/to/script.sh - Проверьте окружение. Cron имеет минимальное окружение (обычно только
PATH=/usr/bin:/bin). Если ваш скрипт использует команды из других каталогов (например,python3из/usr/local/bin), либо укажите полный путь, либо задайтеPATHв самом crontab:PATH=/usr/local/bin:/usr/bin:/bin * * * * * /path/to/script.sh
Шаг 6: Полезные примеры
Вот несколько распространённых сценариев:
- Запуск каждые 5 минут:
*/5 * * * * /usr/bin/wget -q https://example.com/heartbeat - Ежедневный запуск в 1:00:
0 1 * * * /home/user/daily_backup.sh - Выполнение в 9:00 и 17:00 будних дней:
0 9,17 * * 1-5 /home/user/work_start.sh - Запуск в первый день месяца в 2:30:
30 2 1 * * /home/user/monthly_report.sh - Выполнение при загрузке системы (например, для запуска фонового процесса):
@reboot /usr/local/bin/my_daemon --config /etc/my_daemon.conf - Запуск каждую минуту (для тестирования):
* * * * * /home/user/test_cron.sh
💡 Совет: Для сложных расписаний используйте онлайн-генераторы crontab (например, crontab.guru) — они наглядно показывают, когда будет выполняться задание.
Проверка результата
После добавления задания:
- Убедитесь, что оно появилось в списке:
crontab -l. - Если задание должно было уже сработать, проверьте логи (см. Шаг 5) или файл, который должен был создаться (например,
/tmp/cron_test.log). - Для быстрой проверки добавьте задание, которое срабатывает каждую минуту (
* * * * * ...), и наблюдайте за результатом в течение нескольких минут. - Проверьте, что скрипт выполняется корректно при ручном запуске (вне cron) — так вы исключите ошибки в самом скрипте.
Возможные проблемы
- "Cron не запускает мой скрипт, хотя вручную он работает"
Причина: отсутствие абсолютных путей в скрипте или недостаточные права. Решение: используйте полные пути ко всем командам внутри скрипта и убедитесь, что скрипт исполняем (chmod +x). - "В логах cron нет записей о моём задании"
Причина: возможно, демон cron не запущен или задание добавлено в crontab другого пользователя. Решение: проверьте статус службы (systemctl status cron) и убедитесь, что редактировали crontab нужного пользователя. - "Задание выполняется, но с ошибками"
Причина: окружение cron сильно отличается от вашего интерактивного shell (нет переменныхPATH,HOME,USERи т.д.). Решение: явно задавайте нужные переменные в crontab или внутри скрипта, используйте абсолютные пути. - "Cron игнорирует строку с
@reboot"
Причина: в некоторых дистрибутивах (например, CentOS) для@rebootтребуется отдельная настройка (в/etc/crontabили через systemd). Решение: используйте стандартный формат в пользовательском crontab, либо создайте systemd-таймер для задач при загрузке. - "Задание выполняется дважды"
Причина: возможно, задание добавлено и в пользовательский crontab, и в системный (/etc/crontab). Решение: проверьте оба места и оставьте только одну запись. - "Cron не может найти интерпретатор скрипта (например, bash)"
Причина: в первой строке скрипта указан неверный путь к интерпретатору. Решение: используйте#!/bin/bash(или#!/usr/bin/env bashдля переносимости) и убедитесь, что файл интерпретатора существует.