JavaRush /Курсы /Docker SELF /Автоматизация задач с помощью cron и at

Автоматизация задач с помощью cron и at

Docker SELF
3 уровень , 5 лекция
Открыта

1. Зачем нужна автоматизация?

Автоматизация задач — это основа основ для любого системного администратора, особенно в Linux. Представьте работу без автоматизации: каждое утро вы заходите в терминал и вводите одну и ту же команду, чтобы сделать копии ваших данных, архивировать их, отправить на сервер и почистить старые логи. Через неделю такая рутина заставит вас задуматься о смене профессии… Но нет, мы тут для того, чтобы научить вас, как сделать машину своим верным слугой.

Сегодняшняя лекция — это магия времени и задач. Мы научимся автоматизировать процессы на уровне операционной системы с помощью невероятных инструментов cron и at. Эти утилиты спасают огромное количество времени, а иногда и нервов.

Автоматизация — это спасательный круг для любой рутинной задачи. Например, у вас есть скрипт, который генерирует отчёт для вашего начальника. Этот отчёт нужен каждое утро в 8:00. Вместо того чтобы вставать раньше, чтобы вручную запускать скрипт (и рисковать застрять с чашкой кофе и забыть запустить), вы можете настроить cron для выполнения этой задачи автоматически.

cron — это инструмент для регулярных задач, которые повторяются в установленное время.
at — это утилита для одноразовых задач, которые должны выполниться в конкретный момент времени.


2. Работа с cron

Что такое cron?

cron — это демон (системный процесс), который работает в фоновом режиме и выполняет задачи, запрограммированные в определённое время. Расписания для этих задач хранятся в так называемых crontab — это текстовые файлы. Каждый пользователь в системе может иметь свой собственный crontab.

Ваша первая задача в cron

Вот как выглядит базовая команда для работы с cron:

crontab -e

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

Синтаксис расписания

Строка в crontab состоит из шести полей:

* * * * * COMMAND
- - - - -
| | | | └─ День недели (0–7, где 0 и 7 — воскресенье)
| | | └── Месяц (1–12)
| | └─── День месяца (1–31)
| └──── Часы (0–23)
└───── Минуты (0–59)

Пример: выполните echo "Hello, Linux" каждый день в полдень:

0 12 * * * echo "Hello, Linux"

Практика: запустим простую задачу

  1. Откройте ваш crontab для редактирования:

    crontab -e
    
  2. Добавьте строку:

    */5 * * * * echo "Hello, world! The time is $(date)" >> ~/cron_test.log
    

    Это задание будет добавлять строку с текущим временем в файл cron_test.log каждые 5 минут. Сохраните файл и выйдите.

  3. Проверьте, запустилась ли задача:

    tail -f ~/cron_test.log
    

    Через 5 минут вы должны увидеть обновлённую запись в файле.

Просмотр запланированных задач

Чтобы проверить текущие задачи:

crontab -l

Удаление задач

Чтобы удалить все задачи из crontab:

crontab -r

Реальные примеры использования cron

Архивация файлов

Допустим, вы хотите архивировать файлы из каталога /var/logs каждую ночь в 3 часа:

  1. Напишите скрипт:

    #!/bin/bash
    tar -czf /backup/logs_$(date +\%Y-\%m-\%d).tar.gz /var/logs
  2. Задайте расписание в crontab:

    0 3 * * * /path/to/script.sh
    

И всё! Вы больше никогда не забудете сделать резервную копию.

Уведомление о загрузке системы

Например, вы хотите получать уведомление, если нагрузка на процессор больше 80%:

  1. Напишите скрипт:

    #!/bin/bash
    LOAD=$(uptime | awk '{print $10}' | sed 's/,//')
    if (( $(echo "$LOAD > 0.80" | bc -l) )); then
        echo "High CPU load: $LOAD" | mail -s "CPU Alert" you@example.com
    fi
  2. Установите расписание:

    */10 * * * * /path/to/cpu_check.sh
    

3. Работа с at

at позволяет выполнить одноразовую задачу в конкретное время. В отличие от cron, задачи at не повторяются. Это удобно для задач типа "сделать это завтра в 9 утра".

Простая задача с at

Вот пример, как запланировать задачу:

echo "echo 'Hello, Linux!'" | at now + 1 minute

Эта команда запустит команду echo 'Hello, Linux!' через одну минуту.

Вы можете указать точное время и дату:

echo "echo 'Backup completed!'" | at 10:30 AM tomorrow

Управление задачами at

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

atq

Пример вывода:

1   Tue Oct 31 10:30:00 2023 a user
2   Tue Oct 31 11:00:00 2023 a user

Чтобы удалить задачу:

atrm <job_id>

Практика: использование at для уведомлений

  1. Создайте задачу для уведомления через 2 минуты:

    echo "notify-send 'Time is up!'" | at now + 2 minutes
    
  2. Проверьте список задач:

    atq
    
  3. Ожидайте появление всплывающего окна через 2 минуты.


4. Типичные ошибки при работе с cron и at

Одной из самых частых проблем является указание неправильного пути к скрипту или команде. Помните, что cron выполняется в минимальной среде окружения, поэтому может не знать о ваших переменных, таких как PATH. Лучший способ — использовать абсолютные пути.

Например, если вы хотите запустить Python-скрипт:

*/30 * * * * /usr/bin/python3 /path/to/script.py

Также убедитесь, что скрипт имеет права на выполнение:

chmod +x /path/to/script.sh

Где это пригодится?

Навыки автоматизации требуют почти в каждой профессии, связанной с IT. Вы можете использовать эти знания:

  • Для автоматизации рутинных системных задач.
  • Для настройки периодического резервного копирования.
  • Для мониторинга состояния серверов.
  • На собеседованиях, где часто спрашивают про cron и автоматизацию.

Если вы работаете в DevOps, администрировании систем или просто хотите стать продуктивнее, понимание cron и at поможет вам выделиться и сэкономить массу времени.

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

1
Задача
Docker SELF, 3 уровень, 5 лекция
Недоступна
Работа с `crontab` для регулярных задач
Работа с `crontab` для регулярных задач
1
Задача
Docker SELF, 3 уровень, 5 лекция
Недоступна
Использование `at` для одноразовых задач
Использование `at` для одноразовых задач
1
Задача
Docker SELF, 3 уровень, 5 лекция
Недоступна
Архивация каталогов с использованием `cron`
Архивация каталогов с использованием `cron`
1
Задача
Docker SELF, 3 уровень, 5 лекция
Недоступна
Автоматическое уведомление о CPU нагрузке
Автоматическое уведомление о CPU нагрузке
Комментарии (8)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Gans Electro Уровень 12
9 марта 2026
Архивация каталогов с использованием `cron`: Разберём команду по частям 👇 ```bash tar -czf /backup/logs_$(date +\%Y-\%m-\%d).tar.gz /var/logs ``` Эта команда **создаёт архив сжатых логов с текущей датой в имени файла**. --- # 1️⃣ `tar` `tar` = **tape archive** Исторически использовался для записи файлов на магнитную ленту, сейчас это просто **утилита для архивирования файлов**. --- # 2️⃣ Флаги `-czf` ### `-c` **create** Создать архив. --- ### `-z` Сжать архив через **gzip**. Поэтому расширение: ``` .tar.gz ``` --- ### `-f` **file** После этого флага указывается **имя архива**. --- # 3️⃣ Имя архива ```bash /backup/logs_$(date +\%Y-\%m-\%d).tar.gz ``` Здесь используется **подстановка команды**. ``` $(команда) ``` → результат команды вставляется в строку. --- ## `date +\%Y-\%m-\%d` Форматирует дату. | код | значение | | ---- | -------- | | `%Y` | год | | `%m` | месяц | | `%d` | день | Пример: ``` 2026-03-09 ``` --- ## Почему перед `%` стоит `\` ``` \%Y ``` Это **экранирование для cron**. В `cron` символ `%` имеет специальное значение (разделяет команды), поэтому его нужно экранировать. В обычном терминале можно писать без `\`. --- # 4️⃣ Что получится Например сегодня **9 марта 2026**: ```bash /backup/logs_2026-03-09.tar.gz ``` --- # 5️⃣ `/var/logs` Это **что архивировать**. В архив попадёт весь каталог: ``` /var/logs ``` --- # 6️⃣ Итог работы команды Создаётся архив: ``` /backup/logs_2026-03-09.tar.gz ``` который содержит: ``` /var/logs/* ``` --- # 7️⃣ Визуально Было: ``` /var/logs ├─ syslog ├─ auth.log └─ nginx.log ``` После команды: ``` /backup └─ logs_2026-03-09.tar.gz ``` --- # 8️⃣ Как посмотреть архив ```bash tar -tzf logs_2026-03-09.tar.gz ```
Gans Electro Уровень 12
9 марта 2026
Использование `at` для одноразовых задач

(crontab -l 2>/dev/null; echo "*/2 * * * * date > ~/task1.log")
Это **группа команд**, которая выполняется **в скобках**. Скобки `()` означают: > выполнить несколько команд и объединить их вывод. --- # 1️⃣ `crontab -l`

crontab -l
Показывает **текущие задания cron пользователя**. Например:

*/5 * * * * echo "Hello" >> ~/cron_test.log
--- # 2️⃣ `2>/dev/null` Это **перенаправление ошибок**. ``` 2 → stderr (ошибки) > → перенаправить /dev/null → "чёрная дыра" ``` То есть:

crontab -l 2>/dev/null
означает: > покажи задания cron, **но если их нет — не выводи ошибку** Потому что без этого будет: ``` no crontab for user ``` --- # 3️⃣ `;` Разделитель команд. ``` команда1 ; команда2 ``` → сначала выполняется первая, потом вторая. --- # 4️⃣ `echo "*/2 * * * * date > ~/task1.log"` Это просто **печатает новую строку для cron**: */2 * * * * date > ~/task1.log # 6️⃣ И зачем это всё Потому что **crontab -e нельзя автоматизировать**. Поэтому делают такой трюк: 1. взять **старые задания** 2. **добавить новое** 3. записать обратно --- # Вся команда целиком

(crontab -l 2>/dev/null; echo "*/2 * * * * date > ~/task1.log") | crontab -
означает: ``` взять старые cron задачи добавить новую записать всё обратно в crontab ``` --- # Визуально Было: ``` */5 * * * * echo Hello ``` После команды станет:

*/5 * * * * echo Hello
*/2 * * * * date > ~/task1.log
Slevin Уровень 59
24 сентября 2025
Первая задача.... В итоге приняло вот такое:

echo "*/2 * * * * date > ~/task1.log" | crontab -
crontab -l
sleep 120 && tail -n 1 ~/task1.log
Я хочу чтобы у автора этого задания случилось что-нибудь довольно плохое. Я шлю ему лучи космического поноса и добавляю это задание в формате "0 3 * * 1 luchi_kosmicheskogo_ponosa.sh"
Slevin Уровень 59
24 сентября 2025
Например, вы хотите получать уведомление, если нагрузка на процессор больше 80%: Напишите скрипт:

#!/bin/bash
LOAD=$(uptime | awk '{print $10}' | sed 's/,//')
if (( $(echo "$LOAD > 0.80" | bc -l) )); then
    echo "High CPU load: $LOAD" | mail -s "CPU Alert" you@example.com
fi
Я случайно вызвал Сатану, что делать?
Ilya Klimchev Уровень 2
13 сентября 2025
проц надо каждые 10 секунд проверять. Хотя бы.
Stitch Уровень 14
4 марта 2025
неплохо бы явно объяснить разницу между */5 * * * * и 5 * * * *
Иван Уровень 11
21 января 2026
Субъективно мб, но вроде все понятно, */5 каждые 5 минут, второй вариант выполнять на 5 минуте каждого часа
Gans Electro Уровень 12
9 марта 2026
А просто * * * * * будет работать каждую минуту