Linux

Cron в Linux: полное руководство по автоматизации задач

Это руководство познакомит вас с cron — стандартным планировщиком задач в Linux. Вы научитесь создавать, управлять и отлаживать cron-задания для автоматизации регулярных операций.

Обновлено 16 февраля 2026 г.
10-15 мин
Низкая
FixPedia Team
Применимо к:Ubuntu 20.04+Debian 10+CentOS 7+Fedora 35+Arch Linux

Введение

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

Требования

Перед началом убедитесь, что:

  • У вас есть доступ к терминалу Linux (локально или через SSH).
  • Установлен демон cron (обычно предустановлен в большинстве дистрибутивов). В Debian/Ubuntu это пакет cron, в CentOS/Fedora — cronie.
  • У вас есть права на выполнение задач (cron работает в контексте текущего пользователя).
  • Для тестирования подготовьте простой скрипт, например ~/test.sh с содержимым:
    #!/bin/bash
    echo "Cron работает: $(date)" >> /tmp/cron_test.log
    
    Не забудьте сделать его исполняемым: chmod +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. Чтобы отредактировать его:

  1. В терминале выполните:
    crontab -e
    
  2. При первом запуске система может спросить, какой редактор использовать (nano или vim). Рекомендуем выбрать nano для простоты.
  3. Откроется текстовый файл (возможно пустой). Это и есть ваш crontab.

💡 Совет: Если вы хотите редактировать crontab другого пользователя (например, root), используйте sudo crontab -e. Но будьте осторожны — задания от root выполняются с привилегиями суперпользователя.

Шаг 3: Добавление задания

В открытом редакторе:

  1. Перейдите в конец файла.
  2. Добавьте строку с заданием. Например, чтобы запускать скрипт ~/backup.sh каждый день в 2:30 ночи:
    30 2 * * * /home/ваш_пользователь/backup.sh
    
  3. Убедитесь, что путь к скрипту абсолютный (начинается с /). 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: Отладка и логи

Если задание не выполняется, ищите причину в логах:

  1. Проверьте статус службы cron:
    systemctl status cron      # Debian/Ubuntu
    systemctl status crond     # CentOS/Fedora
    

    Служба должна быть активной (active (running)).
  2. Просмотрите логи 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
    
  3. Проверьте вывод команды. По умолчанию cron отправляет любой вывод (stdout и stderr) на email пользователю (локальному). Чтобы перехватить его, добавьте перенаправление в файл:
    * * * * * /path/to/script.sh >> /tmp/script.log 2>&1
    

    Так вы сохраните и стандартный вывод, и ошибки.
  4. Убедитесь в правах на скрипт. Скрипт должен быть исполняемым:
    chmod +x /path/to/script.sh
    
  5. Проверьте окружение. 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) — они наглядно показывают, когда будет выполняться задание.

Проверка результата

После добавления задания:

  1. Убедитесь, что оно появилось в списке: crontab -l.
  2. Если задание должно было уже сработать, проверьте логи (см. Шаг 5) или файл, который должен был создаться (например, /tmp/cron_test.log).
  3. Для быстрой проверки добавьте задание, которое срабатывает каждую минуту (* * * * * ...), и наблюдайте за результатом в течение нескольких минут.
  4. Проверьте, что скрипт выполняется корректно при ручном запуске (вне 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 для переносимости) и убедитесь, что файл интерпретатора существует.

Часто задаваемые вопросы

Как проверить, работает ли служба cron?
Почему мой cron-задание не выполняется, хотя вручную скрипт работает?
Как настроить cron на выполнение задания каждые 30 минут?
Можно ли использовать переменные окружения в crontab?

Полезное

Изучите синтаксис строки времени cron
Откройте crontab для редактирования
Добавьте новое задание
Сохраните изменения и выйдите
Проверьте список текущих заданий
Удалите или отредактируйте задание