Planetahost VPS
Перейти к основному контенту

Автоматизация в Linux с помощью Cron

intro-Automation-Linux-with-Cron-planetahost.png

Подробности урока

Уровень сложности Лёгкий
Права root Требуются
Требования Терминал Linux
Категория Установка ПО
Совместимость с ОС Debian, Ubuntu, RHEL
Примерное время чтения 15 мин.

Введение

Практически на каждом Linux-сервере регулярно выполняются десятки фоновых задач:

  • резервное копирование;

  • очистка временных файлов;

  • обновление баз данных;

  • выпуск SSL-сертификатов;

  • мониторинг сервисов;

  • отправка уведомлений.

Большинство таких операций запускается автоматически благодаря сервису Cron.

Cron - это встроенный планировщик задач Linux, который позволяет выполнять команды и скрипты по расписанию.

Например:

  • каждый день в 03:00 создавать резервную копию;

  • каждые 5 минут проверять доступность сайта;

  • каждый час очищать временные файлы;

  • каждое воскресенье отправлять отчёт на почту.

Инструкция

Проверяем, установлен ли Cron

На большинстве дистрибутивов он уже установлен.

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

systemctl status cron

Для некоторых дистрибутивов:

systemctl status crond

Если сервис работает, вы увидите:

изображение.png

Запуск и автозапуск Cron

Запуск:

systemctl start cron

Автозапуск при загрузке системы:

systemctl enable cron

Проверка:

systemctl is-enabled cron

изображение.png

Что такое Crontab

Crontab (Cron Table) - это файл с расписанием задач, который используется службой Cron для автоматического запуска команд и скриптов по заданному времени.

Посмотреть задачи текущего пользователя:

crontab -l

изображение.png

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

crontab -e

изображение.png

Удалить все задачи:

crontab -r
Структура записи Cron

Типичная запись выглядит так:

0 3 * * * /root/backup.sh

Разберём её по частям:

┌──────── минута
│ ┌────── час
│ │ ┌──── день месяца
│ │ │ ┌── месяц
│ │ │ │ ┌ день недели
│ │ │ │ │
0 3 * * * команда
Значения полей

Минуты

0-59

Пример:

15 * * * *

Каждый час в 15 минут.


Часы

0-23

Пример:

0 2 * * *

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


День месяца

1-31

Пример:

0 5 1 * *

Первого числа каждого месяца.


Месяц

1-12

Пример:

0 0 * 12 *

Каждый день в декабре.


День недели

0-7

Где:

0 и 7 = воскресенье
1 = понедельник

Пример:

0 10 * * 1

Каждый понедельник в 10:00.


Специальный символ *

Означает:

любое значение

Например:

* * * * *

Команда будет выполняться каждую минуту.


Выполнение каждые 5 минут

*/5 * * * * команда

Пример:

*/5 * * * * curl https://wiki.planetahost.ru/

Выполнение каждые 10 минут

*/10 * * * * команда

Выполнение каждый час

0 * * * * команда

Выполнение раз в сутки

0 0 * * * команда

Полночь каждого дня.


Выполнение по будням

0 9 * * 1-5 команда

С понедельника по пятницу.


Выполнение по выходным

0 10 * * 6,0 команда

Выполнение нескольких раз в день

Например:

0 6,12,18 * * * команда

Запуск:

  • 06:00

  • 12:00

  • 18:00


Реальные примеры

Резервное копирование

Скрипт:

#!/bin/bash

tar -czf /backup/site-$(date +%F).tar.gz /var/www

Cron:

0 3 * * * /root/backup.sh

Скрипт создаёт сжатый архив каталога /var/www и сохраняет его в папку /backup. каждый день в 03:00.


Проверка сайта

Cron:

*/5 * * * * curl -fs https://wiki.planetahost.ru/ >/dev/null

Эта задача Cron каждые 5 минут отправляет HTTP-запрос на сайт https://wiki.planetahost.ru/, чтобы проверить его доступность. Параметры -f и -s заставляют curl работать тихо и возвращать ошибку при проблемах с доступом к сайту.


Очистка логов

Cron:

0 2 * * 0 find /var/log/app -type f -mtime +30 -delete

Эта задача запускается каждое воскресенье в 02:00 и удаляет из каталога /var/log/app все файлы, которые были изменены более 30 дней назад.


Перенаправление вывода

По умолчанию Cron пытается отправлять результаты выполнения по почте. Чаще всего это не требуется.

Отключить вывод:

0 3 * * * /root/backup.sh > /dev/null 2>&1

Запись в лог

Полезнее сохранять результат:

0 3 * * * /root/backup.sh >> /var/log/backup.log 2>&1

Почему скрипт работает вручную, но не работает в Cron

Самая распространённая проблема.

Например:

/root/script.sh

работает, но через Cron - нет.

Причина обычно в переменной PATH.

Неправильно

*/5 * * * * php script.php

Правильно

Сначала узнать путь:

which php

Например:

/usr/bin/php

После чего:

*/5 * * * * /usr/bin/php /root/script.php

Проверяем логи Cron

Для Debian и Ubuntu:

grep CRON /var/log/syslog

Для RHEL и CentOS:

grep CROND /var/log/cron

Выполнение задачи после перезагрузки

Для этого используется специальное слово:

@reboot

Пример:

@reboot /root/startup.sh

Скрипт выполнится после загрузки системы.

Полезные специальные записи

Каждый час:

@hourly

Каждый день:

@daily

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

@weekly

Каждый месяц:

@monthly

Каждый год:

@yearly

Как избежать запуска нескольких копий скрипта

Частая проблема, если задача выполняется 15 минут, а Cron запускает её каждые 5 минут:

*/5 * * * * script.sh

Начнут накапливаться процессы.

Решение:

*/5 * * * * flock -n /tmp/script.lock /root/script.sh

Пока работает одна копия, новая не запустится.

Проверка синтаксиса Cron

Полезный сервис: crontab.guru

Там можно быстро проверить расписание.

Например:

*/15 * * * *

Сервис сразу покажет:

Every 15 minutes

Безопасность

Не рекомендуется:

  • запускать всё от root;

  • использовать права 777;

  • хранить пароли в скриптах;

  • запускать непроверенные команды через Cron.

Лучше создавать отдельного пользователя для автоматизации задач.

Заключение

Cron остаётся одним из самых простых и надёжных инструментов автоматизации в Linux. С его помощью можно выполнять как простые команды, так и сложные сценарии резервного копирования, мониторинга и обслуживания серверов.

Главное - использовать абсолютные пути к программам, проверять журналы системы и тестировать команды вручную перед добавлением в расписание. В этом случае Cron станет надёжным помощником в повседневном администрировании Linux-серверов.