Cron и crontab в Linux простыми словами: задачи по расписанию
Как сделать так, чтобы Linux сам запускал команду каждый день в два часа ночи?
Как выполнять скрипт каждые пять минут?
Как автоматически запускать задачу после перезагрузки системы?
Для таких задач в Linux существует cron — один из классических механизмов автоматического запуска команд по расписанию.
Что такое cron
cron — это служба Linux, которая запускает команды и скрипты по расписанию.
Например, с его помощью можно:
- выполнять резервное копирование ночью;
- очищать временные файлы;
- запускать скрипт мониторинга каждые пять минут;
- регулярно формировать отчёт;
- синхронизировать данные;
- выполнять обслуживание системы.
Условно работа выглядит так:
| |
То есть вместо того, чтобы каждый раз запускать команду вручную, мы один раз описываем расписание.
Cron и crontab — в чём разница
Эти два понятия часто путают.
cron — это служба, которая выполняет задания.
crontab — это таблица с расписанием этих заданий.
Можно представить так:
| |
Для управления пользовательским crontab используется команда:
| |
Как посмотреть текущие задания cron
Чтобы посмотреть задания текущего пользователя:
| |
Если заданий ещё нет, система может сообщить:
| |
Это нормально.
Как добавить задание cron
Открыть таблицу заданий для редактирования:
| |
При первом запуске система может предложить выбрать текстовый редактор.
После этого откроется файл, куда можно добавлять задания.
Например:
| |
Эта команда будет выполняться каждую минуту и записывать текущую дату и время в файл:
| |
Как читать расписание cron
Самая известная часть cron выглядит так:
| |
Пять полей означают:
| |
В полном виде:
| |
Для дня недели обычно:
| |
Простые примеры cron
Каждую минуту
| |
Каждый час
| |
Команда выполняется в начале каждого часа.
Например:
| |
Каждый день в 02:00
| |
Разбираем:
| |
Каждый день в 09:30
| |
Каждые 5 минут
| |
Конструкция:
| |
означает:
| |
В данном случае — каждые пять минут.
Каждые 10 минут
| |
Диапазоны в cron
Можно задавать диапазоны.
Например:
| |
Задача будет выполняться:
| |
То есть только в рабочие дни.
Списки значений
Можно указывать несколько конкретных значений через запятую.
Например:
| |
Команда будет выполняться:
| |
в 10:00.
Раз в месяц
Например, первого числа каждого месяца в 03:00:
| |
Специальные сокращения cron
Помимо стандартной конструкции:
| |
существуют специальные обозначения.
После загрузки системы
| |
Команда будет запускаться после старта системы.
Каждый час
| |
Каждый день
| |
Каждую неделю
| |
Каждый месяц
| |
Каждый год
| |
Такие конструкции иногда читаются гораздо проще, чем обычное расписание.
Например:
| |
понятнее, чем:
| |
Практика: запускаем скрипт через cron
Создадим простой скрипт:
| |
Добавим:
| |
Сохраним файл.
Теперь дадим ему права на выполнение:
| |
Проверим вручную:
| |
Посмотрим результат:
| |
Теперь добавим скрипт в cron:
| |
Добавляем:
| |
Теперь скрипт будет запускаться каждую минуту.
Через некоторое время снова проверяем:
| |
Если появляются новые строки, значит cron работает.
Как удалить задания cron
Посмотреть текущие:
| |
Редактировать:
| |
Можно удалить конкретную строку вручную.
Полностью удалить пользовательский crontab:
| |
С этой командой нужно быть осторожным: она удаляет всю таблицу заданий пользователя.
Пользовательский и системный cron
До этого мы работали с пользовательским crontab.
Но в Linux существует также системный cron.
Один из основных файлов:
| |
Его структура немного отличается.
Например:
| |
Здесь появляется дополнительное поле:
| |
То есть системный crontab дополнительно указывает, от имени какого пользователя должна выполняться команда.
Схема получается такой:
| |
Каталоги /etc/cron.*
В Linux также можно встретить каталоги:
| |
Названия достаточно хорошо объясняют назначение.
Например:
| |
предназначен для задач, которые должны регулярно выполняться примерно раз в день.
Также существует:
| |
Там могут находиться отдельные файлы с расписаниями.
Для системного администратора важно знать эти каталоги, потому что задания cron не всегда находятся только в пользовательском:
| |
Где хранятся пользовательские crontab
В зависимости от дистрибутива они могут находиться, например, в:
| |
или:
| |
Редактировать эти файлы вручную обычно не нужно.
Для работы с пользовательскими заданиями лучше использовать:
| |
cron.allow и cron.deny
Linux позволяет ограничивать пользователей, которым разрешено работать с cron.
Для этого существуют файлы:
| |
и:
| |
cron.allow может содержать список пользователей, которым разрешено использовать cron.
Например:
| |
Если используется cron.deny, наоборот, в нём перечисляются пользователи, которым использование cron запрещено.
Этот механизм полезен в многопользовательских системах.
Почему команда работает вручную, но не работает через cron
Это одна из самых распространённых проблем.
Вы запускаете:
| |
в терминале — всё работает.
Добавляете его в cron — ничего не происходит.
Причина часто в том, что cron запускает команды в другом окружении.
Например, переменная:
| |
может отличаться от той, которую вы видите в обычном терминале.
Поэтому вместо:
| |
лучше использовать полный путь:
| |
То же самое касается команд внутри самого скрипта.
В некоторых случаях вместо:
| |
лучше явно указать:
| |
Посмотреть путь к программе можно командой:
| |
Например:
| |
Не забывайте о рабочей директории
Ещё одна типичная ошибка.
Представим скрипт:
| |
Внутри него используется файл:
| |
Когда вы запускаете скрипт вручную из нужной директории, всё работает.
Но cron может запускать его из другого места.
Поэтому лучше либо использовать абсолютные пути:
| |
либо явно переходить в директорию:
| |
В cron:
| |
Куда выводится результат cron
Обычная команда может выводить:
| |
Но при запуске через cron вы не видите терминал.
Поэтому удобно перенаправлять вывод в лог.
Например:
| |
Разберём:
| |
добавляет обычный вывод в файл.
А:
| |
перенаправляет туда же ошибки.
В итоге и обычный вывод, и ошибки будут находиться в:
| |
Это очень удобно для диагностики.
Как проверить, работает ли cron
Сначала можно проверить состояние службы.
В системах с systemd:
| |
На некоторых дистрибутивах служба может называться:
| |
Если она остановлена, её можно запустить:
| |
или:
| |
Логи cron
В зависимости от дистрибутива информация может находиться в разных местах.
Например:
| |
или:
| |
На некоторых системах записи cron можно искать в системных логах.
Например:
| |
Конкретное расположение зависит от дистрибутива и настроек логирования.
Типичная диагностика cron
Если задача не выполняется, можно пройтись по короткому чек-листу.
1. Работает ли команда вручную?
| |
2. Есть ли права на выполнение?
| |
При необходимости:
| |
3. Используются ли абсолютные пути?
Лучше:
| |
чем:
| |
4. Записываются ли ошибки?
| |
5. Работает ли служба cron?
| |
6. Есть ли задание в crontab?
| |
Краткая шпаргалка cron
Редактировать задания
| |
Посмотреть задания
| |
Удалить пользовательский crontab
| |
Каждую минуту
| |
Каждые 5 минут
| |
Каждый час
| |
Каждый день в 02:00
| |
По будням в 09:00
| |
После загрузки
| |
Каждый день
| |
Что нужно запомнить начинающему Linux-администратору
В первую очередь достаточно понимать:
| |
И особенно важно понимать принцип:
cron запускает команды автоматически, но его окружение отличается от обычной интерактивной shell-сессии.
Поэтому абсолютные пути и логирование решают огромное количество проблем.
Cron, at и systemd timers
cron хорошо подходит для регулярных задач.
Например:
| |
Презентация и видео по теме
➡️Rutube
➡️VK
➡️YouTube
Документация
crontab(5) — Linux man-pages
Формат файлаcrontab, расписание и специальные конструкции.crontab(1) — Linux man-pages
Командаcrontab, параметры-e,-l,-rи другие.LPIC-1 Objectives
Требования LPIC-1, включая автоматизацию системных задач по расписанию.