Cron и crontab в Linux простыми словами: задачи по расписанию

Cron и crontab в Linux простыми словами: задачи по расписанию

Cron и crontab в Linux простыми словами: задачи по расписанию

Как сделать так, чтобы Linux сам запускал команду каждый день в два часа ночи?

Как выполнять скрипт каждые пять минут?

Как автоматически запускать задачу после перезагрузки системы?

Для таких задач в Linux существует cron — один из классических механизмов автоматического запуска команд по расписанию.


Что такое cron

cron — это служба Linux, которая запускает команды и скрипты по расписанию.

Например, с его помощью можно:

  • выполнять резервное копирование ночью;
  • очищать временные файлы;
  • запускать скрипт мониторинга каждые пять минут;
  • регулярно формировать отчёт;
  • синхронизировать данные;
  • выполнять обслуживание системы.

Условно работа выглядит так:

1
2
3
4
5
6
7
расписание
    ↓
cron
    ↓
команда или скрипт
    ↓
результат

То есть вместо того, чтобы каждый раз запускать команду вручную, мы один раз описываем расписание.


Cron и crontab — в чём разница

Эти два понятия часто путают.

cron — это служба, которая выполняет задания.

crontab — это таблица с расписанием этих заданий.

Можно представить так:

1
2
cron     → исполнитель
crontab  → список задач

Для управления пользовательским crontab используется команда:

1
crontab

Как посмотреть текущие задания cron

Чтобы посмотреть задания текущего пользователя:

1
crontab -l

Если заданий ещё нет, система может сообщить:

1
no crontab for user

Это нормально.


Как добавить задание cron

Открыть таблицу заданий для редактирования:

1
crontab -e

При первом запуске система может предложить выбрать текстовый редактор.

После этого откроется файл, куда можно добавлять задания.

Например:

1
* * * * * date >> /home/user/cron.log

Эта команда будет выполняться каждую минуту и записывать текущую дату и время в файл:

1
/home/user/cron.log

Как читать расписание cron

Самая известная часть cron выглядит так:

1
* * * * *

Пять полей означают:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
минута
│
│ час
│ │
│ │ день месяца
│ │ │
│ │ │ месяц
│ │ │ │
│ │ │ │ день недели
│ │ │ │ │
* * * * *

В полном виде:

1
2
3
4
5
6
7
┌──────── минута       0–59
│ ┌────── час          0–23
│ │ ┌──── день месяца  1–31
│ │ │ ┌── месяц        1–12
│ │ │ │ ┌ день недели  0–7
│ │ │ │ │
* * * * * команда

Для дня недели обычно:

1
2
3
4
5
6
7
0 или 7 → воскресенье
1 → понедельник
2 → вторник
3 → среда
4 → четверг
5 → пятница
6 → суббота

Простые примеры cron

Каждую минуту

1
* * * * * /home/user/script.sh

Каждый час

1
0 * * * * /home/user/script.sh

Команда выполняется в начале каждого часа.

Например:

1
2
3
4
10:00
11:00
12:00
13:00

Каждый день в 02:00

1
0 2 * * * /home/user/backup.sh

Разбираем:

1
2
3
4
5
0  → нулевая минута
2  → второй час
*  → любой день месяца
*  → любой месяц
*  → любой день недели

Каждый день в 09:30

1
30 9 * * * /home/user/report.sh

Каждые 5 минут

1
*/5 * * * * /home/user/check.sh

Конструкция:

1
*/5

означает:

1
каждые 5 единиц

В данном случае — каждые пять минут.


Каждые 10 минут

1
*/10 * * * * /home/user/check.sh

Диапазоны в cron

Можно задавать диапазоны.

Например:

1
0 9 * * 1-5 /home/user/report.sh

Задача будет выполняться:

1
2
в 09:00
с понедельника по пятницу

То есть только в рабочие дни.


Списки значений

Можно указывать несколько конкретных значений через запятую.

Например:

1
0 10 * * 1,3,5 /home/user/script.sh

Команда будет выполняться:

1
2
3
в понедельник
в среду
в пятницу

в 10:00.


Раз в месяц

Например, первого числа каждого месяца в 03:00:

1
0 3 1 * * /home/user/monthly.sh

Специальные сокращения cron

Помимо стандартной конструкции:

1
* * * * *

существуют специальные обозначения.

После загрузки системы

1
@reboot /home/user/start.sh

Команда будет запускаться после старта системы.


Каждый час

1
@hourly /home/user/script.sh

Каждый день

1
@daily /home/user/script.sh

Каждую неделю

1
@weekly /home/user/script.sh

Каждый месяц

1
@monthly /home/user/script.sh

Каждый год

1
@yearly /home/user/script.sh

Такие конструкции иногда читаются гораздо проще, чем обычное расписание.

Например:

1
@daily /home/user/backup.sh

понятнее, чем:

1
0 0 * * * /home/user/backup.sh

Практика: запускаем скрипт через cron

Создадим простой скрипт:

1
nano /home/user/cron-test.sh

Добавим:

1
2
3
#!/bin/bash

echo "Cron работает: $(date)" >> /home/user/cron-test.log

Сохраним файл.

Теперь дадим ему права на выполнение:

1
chmod +x /home/user/cron-test.sh

Проверим вручную:

1
/home/user/cron-test.sh

Посмотрим результат:

1
cat /home/user/cron-test.log

Теперь добавим скрипт в cron:

1
crontab -e

Добавляем:

1
* * * * * /home/user/cron-test.sh

Теперь скрипт будет запускаться каждую минуту.

Через некоторое время снова проверяем:

1
cat /home/user/cron-test.log

Если появляются новые строки, значит cron работает.


Как удалить задания cron

Посмотреть текущие:

1
crontab -l

Редактировать:

1
crontab -e

Можно удалить конкретную строку вручную.

Полностью удалить пользовательский crontab:

1
crontab -r

С этой командой нужно быть осторожным: она удаляет всю таблицу заданий пользователя.


Пользовательский и системный cron

До этого мы работали с пользовательским crontab.

Но в Linux существует также системный cron.

Один из основных файлов:

1
/etc/crontab

Его структура немного отличается.

Например:

1
0 2 * * * root /usr/local/bin/backup.sh

Здесь появляется дополнительное поле:

1
root

То есть системный crontab дополнительно указывает, от имени какого пользователя должна выполняться команда.

Схема получается такой:

1
2
3
4
5
6
7
минута
час
день
месяц
день недели
пользователь
команда

Каталоги /etc/cron.*

В Linux также можно встретить каталоги:

1
2
3
4
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/

Названия достаточно хорошо объясняют назначение.

Например:

1
/etc/cron.daily/

предназначен для задач, которые должны регулярно выполняться примерно раз в день.

Также существует:

1
/etc/cron.d/

Там могут находиться отдельные файлы с расписаниями.

Для системного администратора важно знать эти каталоги, потому что задания cron не всегда находятся только в пользовательском:

1
crontab -e

Где хранятся пользовательские crontab

В зависимости от дистрибутива они могут находиться, например, в:

1
/var/spool/cron/

или:

1
/var/spool/cron/crontabs/

Редактировать эти файлы вручную обычно не нужно.

Для работы с пользовательскими заданиями лучше использовать:

1
crontab -e

cron.allow и cron.deny

Linux позволяет ограничивать пользователей, которым разрешено работать с cron.

Для этого существуют файлы:

1
/etc/cron.allow

и:

1
/etc/cron.deny

cron.allow может содержать список пользователей, которым разрешено использовать cron.

Например:

1
2
3
admin
ivan
devops

Если используется cron.deny, наоборот, в нём перечисляются пользователи, которым использование cron запрещено.

Этот механизм полезен в многопользовательских системах.


Почему команда работает вручную, но не работает через cron

Это одна из самых распространённых проблем.

Вы запускаете:

1
script.sh

в терминале — всё работает.

Добавляете его в cron — ничего не происходит.

Причина часто в том, что cron запускает команды в другом окружении.

Например, переменная:

1
PATH

может отличаться от той, которую вы видите в обычном терминале.

Поэтому вместо:

1
* * * * * script.sh

лучше использовать полный путь:

1
* * * * * /home/user/scripts/script.sh

То же самое касается команд внутри самого скрипта.

В некоторых случаях вместо:

1
python3 script.py

лучше явно указать:

1
/usr/bin/python3 /home/user/script.py

Посмотреть путь к программе можно командой:

1
which python3

Например:

1
/usr/bin/python3

Не забывайте о рабочей директории

Ещё одна типичная ошибка.

Представим скрипт:

1
./backup.sh

Внутри него используется файл:

1
config.txt

Когда вы запускаете скрипт вручную из нужной директории, всё работает.

Но cron может запускать его из другого места.

Поэтому лучше либо использовать абсолютные пути:

1
/home/user/project/config.txt

либо явно переходить в директорию:

1
cd /home/user/project && ./backup.sh

В cron:

1
0 2 * * * cd /home/user/project && ./backup.sh

Куда выводится результат cron

Обычная команда может выводить:

1
2
stdout
stderr

Но при запуске через cron вы не видите терминал.

Поэтому удобно перенаправлять вывод в лог.

Например:

1
*/5 * * * * /home/user/script.sh >> /home/user/cron.log 2>&1

Разберём:

1
>> cron.log

добавляет обычный вывод в файл.

А:

1
2>&1

перенаправляет туда же ошибки.

В итоге и обычный вывод, и ошибки будут находиться в:

1
/home/user/cron.log

Это очень удобно для диагностики.


Как проверить, работает ли cron

Сначала можно проверить состояние службы.

В системах с systemd:

1
systemctl status cron

На некоторых дистрибутивах служба может называться:

1
systemctl status crond

Если она остановлена, её можно запустить:

1
sudo systemctl start cron

или:

1
sudo systemctl start crond

Логи cron

В зависимости от дистрибутива информация может находиться в разных местах.

Например:

1
journalctl -u cron

или:

1
journalctl -u crond

На некоторых системах записи cron можно искать в системных логах.

Например:

1
grep CRON /var/log/syslog

Конкретное расположение зависит от дистрибутива и настроек логирования.


Типичная диагностика cron

Если задача не выполняется, можно пройтись по короткому чек-листу.

1. Работает ли команда вручную?

1
/home/user/script.sh

2. Есть ли права на выполнение?

1
ls -l /home/user/script.sh

При необходимости:

1
chmod +x /home/user/script.sh

3. Используются ли абсолютные пути?

Лучше:

1
/home/user/script.sh

чем:

1
script.sh

4. Записываются ли ошибки?

1
/home/user/script.sh >> /home/user/cron.log 2>&1

5. Работает ли служба cron?

1
systemctl status cron

6. Есть ли задание в crontab?

1
crontab -l

Краткая шпаргалка cron

Редактировать задания

1
crontab -e

Посмотреть задания

1
crontab -l

Удалить пользовательский crontab

1
crontab -r

Каждую минуту

1
* * * * * command

Каждые 5 минут

1
*/5 * * * * command

Каждый час

1
0 * * * * command

Каждый день в 02:00

1
0 2 * * * command

По будням в 09:00

1
0 9 * * 1-5 command

После загрузки

1
@reboot command

Каждый день

1
@daily command

Что нужно запомнить начинающему Linux-администратору

В первую очередь достаточно понимать:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cron
crontab -e
crontab -l
* * * * *
@reboot
/etc/crontab
/etc/cron.d/
/etc/cron.daily/
/etc/cron.allow
/etc/cron.deny

И особенно важно понимать принцип:

cron запускает команды автоматически, но его окружение отличается от обычной интерактивной shell-сессии.

Поэтому абсолютные пути и логирование решают огромное количество проблем.


Cron, at и systemd timers

cron хорошо подходит для регулярных задач.

Например:

1
2
3
4
каждый час
каждый день
каждую неделю
каждые 10 минут

Презентация и видео по теме

Скачать презентацию

➡️Rutube

➡️VK

➡️YouTube


Документация

Авторский пост защищен лицензией CC BY 4.0.

© solizarevich. Некоторые права защищены.

Использует тему Chirpy для Hugo

Популярные теги