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

2.06. Планирование задач

Разработчику Архитектору Инженеру

Планирование задач

Представьте, что у вас есть исполняемый файл (скрипт), который каждый день в 8 утра пользователь или администратор запускает вручную - например, для резервного копирования важных файлов или запуска какой-то системы. Каждый раз открывается ярлык на рабочем столе, кликаем по нему и ждём завершения. Это работает, но неэффективно. А если забыть, или не будет возможности нажать? А если таких задач десятки?

Именно для этого и существует планирование задач - автоматическое выполнение программ, скриптов или команд в заданное время или при наступлении определённых условий. Это позволяет:

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

Так зачем запускать вручную, если можно автоматизировать?

Автоматический запуск - это выполнение программы без прямого участия пользователя. Например, антивирус сам обновляется, а веб-сервер стартует при включении компьютера.

Планирование задач - это процесс настройки автоматического запуска задач в определённое время или по определённому расписанию.

Планировщик задач - это компонент операционной системы, отвечающий за хранение, управление и выполнение запланированных задач. Он следит за временем, условиями и запускает нужные программы.

Расписание задачи - набор правил, определяющих, когда и при каких условиях задача должна быть выполнена (например «каждый день в 2:00», «при запуске системы», «каждые 10 минут»).

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

Планировщик задач - это фоновый процесс (демон в Linux, служба в Windows), которой работает постоянно и следит за временем и событиями. Вот как это происходит в общих чертах:

  1. Регистрация задачи. Пользователь или системный администратор добавляет задачу в планировщик, указывая:
    • что запускать (путь к скрипту, программе, исполняемому файлу);
    • когда запускать (время, дата, периодичнось);
    • при каких условиях (при запуске системы, при простое, с правами администратора и т.д.).
  2. Хранение расписания. Планировщик сохраняет эту информацию в специальной базе данных или конфигурационном файле.
  3. Мониторинг времени. Планировщик периодически проверяет системное время и сравнивает его с расписаниями задач.
  4. Запуск задачи. Когда наступает нужное время (или выполняется условие), планировщик запускает указанную программу с заданными параметрами.
  5. Логирование. Многие планировщики ведут журнал выполнения - чтобы можно было проверить, успешно ли выполнилась задача, в какое время, были ли ошибки.

Примеры - в Windows используется планировщик заданий (Task Scheduler), в Linux - cron и system timers. Несмотря на различия в реализации, оба подхода решают одну и ту же задачу: автоматизировать выполнение команд по расписанию.

Возможно, вы сталкивались с автозапуском в Windows. Автозапуск - это не планировщик, а частный случай автоматического запуска, который не всегда подчиняется расписанию. Он происходит при других случаях:

  • при входе пользователя в систему (через папку Автозагрузка);
  • при запуске самой ОС (через службы или реестр);
  • при подключении устройства.

Ключевое отличие от планировщика задач в том, что автозапуск не позволяет гибко настраивать время (например, каждый понедельник в 7:30), не поддерживает сложные условия, и не ведёт детального лога выполнения.

Планировщик же включает в себя функции автозапуска, но даёт гораздо больше контроля. Например, вы можете настроить задачу «запускать скрипт при входе пользователя в систему», но при этом добавить условия: только если сеть активна, и только если система не на батарейке.

CRON - это утилита в UNIX-подобных системах (Linux, macOS), предназначенная для планирования выполнения команд по расписанию. Название происходит от греческого слова chronos (время). Есть популярный миф, что CRON это аббревиатура Command On Run - но это не так. 😉

CRON работает как фоновый демон (crond), который постоянно запущен и каждую минуту проверяет конфигурационные файлы, чтобы понять, какие задачи нужно выполнить. Каждый пользователь может иметь свой crontab-файл, специальный файл с расписанием задач. Системные задачи могут быть определены в /etc/crontab или в папке /etc/cron.d/

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

Управляется он при помощи CRON-выражений. Это строка из пяти полей, определяющих, когда должна выполняться команда. Пишутся они подряд, и приблизительно структура такова:

1 2 3 4 5 команда
НомерПолеДопустимые значенияПример
1Минуты0–590, 30, */15 (каждые 15 минут)
2Часы0–232, 14, */6 (каждые 6 часов)
3День месяца1–311, 15, * (каждый день)
4Месяц1–121 (январь), 6, *
5День недели0–70 или 7 (воскресенье), 1 (понедельник), * (все дни)

Важно: день недели и день месяца связаны логическим ИЛИ, если указаны оба — задача выполнится, если совпадает хотя бы одно условие. Но обычно используют только один из них.

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

    • — любое значение («каждый»).
  • , — список значений (например, 1,3,5).
    • — диапазон (например, 9-17 — с 9 до 17).
  • */n — каждые n единиц (например, */5 в минутах — каждые 5 минут).

Допустим, у нас есть скрипт для резервного копирования, который нужно запускать каждый день в 2:30 утра. Скрипт находится по пути: /home/user/scripts/backup.sh

Шаг 1: Открываем crontab для редактирования:

crontab -e

Шаг 2: Добавляем строку:

30 2 * * * /home/user/scripts/backup.sh >> /home/user/logs/backup.log 2>&1

Здесь мы указали:

  • 30 — минута 30.
  • 2 — час 2 (2:30 утра).
    • — любой день месяца.
    • — любой месяц.
    • — любой день недели.

Команда: запуск скрипта.

>> /home/user/logs/backup.log — запись вывода в лог-файл.

2>&1 — перенаправление ошибок туда же.