Включите исполнение JavaScript в браузере, чтобы запустить приложение.
21 янв 2025

Как автоматизировать задачи с помощью Cron Jobs в Linux

В статье расскажем об основах Cron Jobs, их типах, синтаксисе, специальных строках и разрешениях. А еще поделимся рекомендациями по работе с этими заданиями в Linux и приведем примеры полезных команд.

Что такое Cron: основы планировщика задач

Cron — гипервизор расписания работы, который выполняет задания в установленное время. Эти действия называются Cron Jobs и обычно используются для оптимизации управления безопасностью.

Например, можно использовать Cron для запуска приложения, хранения систем баз данных или информации, изменения структуры с автоматическим обновлением. Также он подойдет для проверки использования дискового пространства или отправки сообщений.

На базовом уровне Cron Jobs представляет собой запись, занесенную в таблицу, называемую cron table, или сокращенно crontab. Эта запись содержит расписание и команду, которая должна быть выполнена. Cron daemon (crond) просматривает записи в crontab, чтобы определить, какие задания он должен запускать и когда это нужно сделать в соответствии с расписанием. 

Установка и запуск Cron

Чтобы использовать инструмент, нужно проверить статус службы cron. Если cron не установлен, вы можете легко загрузить его через менеджер пакетов. Для проверки используйте команду:

# Check cron service on Linux system

sudo systemctl status cron.service

Перед запуском убедитесь, что пакет Cron установлен в вашей системе. Если нет, его можно установить с помощью следующей команды:

apt-get install cron -y

или

dnf install crontabs -y

После установки пакета запустите службу и включите ее запуск при перезагрузке системы:

systemctl start cron systemctl enable cron

или

systemctl start crond systemctl enable crond

Синтаксис Cron: как составлять расписание задач

Синтаксис crontab состоит из пяти полей со следующими возможными значениями:

  • минута. Минута часа, в течение которого будет выполнена команда, находится в диапазоне от 0 до 59;
  • час. Время, в течение которого будет выполняться команда, — от 0 до 23 в 24-часовой системе счисления;
  • день месяца. Дата месяца, в котором пользователь хочет запустить команду, — от 1 до 31;
  • месяц. Месяц, в котором пользователь хочет запустить команду, — от 1 до 12, что соответствует периоду с января по декабрь;
  • день недели. День недели, в который выполняется команда, может варьироваться от 0 (воскресенье) до 6 (суббота). В некоторых системах значение 7 соответствует воскресенью.

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

Звездочка (*). Этот оператор обозначает все возможные значения в поле. Например, напишите звездочку в поле «Минута», чтобы задание cron выполнялось каждую минуту.

Запятая (,). Оператор для перечисления нескольких значений. Например, если в поле «День недели» указать значение 1,5, задание будет выполняться по расписанию каждый понедельник и каждую пятницу.

Дефис (-). Пользователи могут определить диапазон значений. Введите 6-9 в поле, чтобы настроить задание с июня по сентябрь.

Разделитель (/). Разделяет значение. Если вы хотите запускать скрипт каждые двенадцать часов, введите */12 в поле «Час».

Последний (L). Пользователи могут использовать этот оператор в полях «День месяца» и «День недели». Например, запись 3L в поле «День недели» означает последнюю среду месяца.

День недели (W). Оператор, который определяет ближайший день недели к заданному времени. Например, если 1-е число месяца приходится на субботу, то запись 1W в поле день месяца приведет к запуску команды в понедельник, 3-го числа.

Хэш (#). Оператор для поля «День недели», который определяет конкретный день месяца, используя число от 1 до 5. Например, 1#2 означает второй понедельник месяца.

Знак вопроса (?). Этот оператор не вводит конкретного значения для полей. Обычно оно заменяется временем запуска daemon cron.

Создание и редактирование

Базовая запись crontab выглядит примерно так. Сначала вводится расписание cron joob, за которым следует команда для запуска:

*    *    *    *    *   /home/user/bin/somecommand.sh

|    |    |    |    |            |

|    |    |    |    |    Command or Script to execute

|    |    |    |    |

|    |    |    | Day of week(0-6 | Sun-Sat)

|    |    |    |

|    |    |  Month(1-12)

|    |    |

|    |  Day of Month(1-31)

|    |

|   Hour(0-23)

|

Min(0-59)

Звездочка (*) соответствует всем значениям. Этот пример,указывает, что /home/user/bin/somecommand.sh следует выполнять с 0 по 59 минуты и с 0 по 23 часа в дни с 1 по 31 месяц, в течение 1–12 месяцев в дни с 0 по 6 неделю. Или, другими словами, «‎каждую минут».

Записи Cron также можно настроить для запуска в более сложное время. Если вы хотите запускать их четыре раза в день с понедельника по пятницу, вы можете использовать оператор шага ( / ) и оператор диапазона ( - ).

Эта запись будет запускать вашу команду каждые шесть часов, начиная с полуночи — в 12:00, 18:00, 18:00 и 18:00, но только с понедельника по пятницу.

0 */6 * * Mon-Fri /home/user/somejob.sh

Логирование и отладка заданий

Перенаправление выходных данных в cron позволяет сохранять результаты запланированных заданий в файл. Вы можете сделать это с помощью операторов перенаправления (> или >>) в вашей команде cron-задания. Одиночная стрелка (>) каждый раз перезаписывает файл. Двойная стрелка (>>) добавляет новые выходные данные в существующий файл.

Чтобы перенаправить выходные данные в файл, используйте этот синтаксис:

* * * * * /path/to/your/script.sh >> /path/to/logfile.log

Как и большинство демонов, работающих в нашей системе, демон cron регистрирует свои выходные данные в файле /var/log. Мы проверяем эти журналы, чтобы убедиться, что наши задания выполняются в нужное время.

Наиболее популярной реализация — Vixie. Логи Vixie хранятся в /var/log/cron. Эти логи показывают, когда выполняется job, но не могут сообщить нам, возникали ли ошибки во время выполнения задания.

Можно также добавить ведение журнала в наш скрипт. Это поможет точно определить, где что-то идет не так, когда возникает ошибка.

Команда printenv и встроенный набор команд Bash хорошо подходят для этого. Мы добавляем их, размещая эти строки вокруг скрипта: 

printenv

set -x

... our script goes here ...

set +x

Команда printenv выводит все переменные среды в стандартный вид вывода. С помощью set -x мы переводим оболочку в режим, в котором все выполняемые команды также будут выводиться на стандартный вывод. В конце работы скрипта мы выключаем режим отладки с помощью set +x.

Другой вариант — использовать инструмент ведения журнала. Это может быть syslog-ng или rsyslog. Инструменты можно настроить для централизованного хранения журналов и предоставления расширенных функций. Например, для фильтрации и оповещения.

Безопасность и оптимизация работы с Cron Jobs

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

  • минимизируйте привилегии и обеспечьте безопасный доступ. Запускайте jobs с минимально необходимыми привилегиями и избегайте их запуска от имени пользователя root без крайней необходимости. Убедитесь, что файлы crontab могут редактироваться только авторизованным персоналом. Храните скрипты в надежном месте, где неавторизованные пользователи не смогут их изменить;
  • используйте абсолютные пути и регулярные проверки. Чтобы предотвратить перехват путей, рекомендуется использовать абсолютные пути в командах в ваших сценариях. Регулярно проверяйте скрипты на наличие уязвимостей в системе безопасности и отслеживайте журналы на предмет непредвиденного поведения или ошибок;
  • реализуйте обработку ошибок и защищайте связь — разработайте сценарии с надежной обработкой ошибок, чтобы предотвратить непреднамеренные действия при сбоях и гарантировать, что сообщения об ошибках не будут содержать конфиденциальной информации. Используйте защищенные протоколы HTTPS и SFTP для сценариев, которые взаимодействуют по сети. Они также подходят для защиты передаваемых данных;
  • проверяйте вводимые данные и отслеживайте действия — очистите все внешние входные данные для сценариев, чтобы предотвратить атаки с использованием инъекций. Настройте оповещения о всех действиях для быстрого устранения потенциальных проблем безопасности.

Расширенные возможности: переменные окружения и условия

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

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

  • объявление переменных в ваших файлах crontab;
  • объявление переменных как части вашей командной строки;
  • загрузка переменных из файла перед выполнением вашей команды.

Объявление переменных в crontab. В этом примере мы настраиваем переменную PATH и пользовательскую переменную приложения. Когда задание cron будет запущено, оно будет искать example.sh в указанном PATH. Когда команда будет запущена, ее среда также будет включать переменные PATH и APP_ENV. Вы можете задать столько различных переменных, сколько нужно для ваших заданий. Они могут располагаться в любом месте файла crontab.

APP_ENV=production

 PATH=/root/it/scripts

 0 0 * * * example.sh

Объявление переменных как части командной строки. Когда вы запускаете команду в Linux и других операционных системах «posix», переменные среды могут быть объявлены встроенными. В этом примере два jobs получают разные значения для одной и той же переменной.

0 * * * * APP_ENV=production /var/data-analytics/export-to-datalake.py  # Every hour

 0 0 * * * APP_ENV=staging  /var/data-analytics/export-to-datalake.py  # Once a day

Загрузка переменные из файла. Если у вас много переменных окружения или если они централизованно управляются Ansible или Consul, вы можете объявить их прямо в файле. Тогда вы можете создать исходный код для этого файла напрямую, используя командную строку. Все переменные, экспортированные в файл, будут частью среды выполнения задания. 

0 * * * * source /var/data-analytics/bootstrap.sh ; /var/data-analytics/export-to-datalake.py

Cron Jobs в контейнерах и Kubernetes

Kubernetes —  это платформа для оркестровки контейнеров с открытым исходным кодом. Она управляет приложениями для запуска на кластере хостов. Cron Jobs в Kubernetes помогают автоматически выполнять задания на основе временных интервалов. 

При создании ресурса Cron Kubernetes регистрирует расписание в формате cron expression. Это расписание определяет время выполнения задания в Kubernetes. Контроллер выполняет проверку каждые 10 секунд, чтобы определить все расписания, которые необходимо выполнить. В назначенное время Kubernetes запускает новый ресурс задания для управления.

После этого Kubernetes автоматически генерирует модули в соответствии с расписанием, чтобы успешно создать модуль. Если модуль не удается правильно инициализировать, Kubernetes автоматически генерирует новый модуль для повторной попытки выполнить задачу.

Часто задаваемые вопросы

Ответим на популярные вопросы о Cron Jobs.

Как создать и отредактировать задание в Cron?

Если вы создаете или редактируете файл crontab, принадлежащий root или другому пользователю, вы должны стать root.

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

Создайте новый файл crontab или отредактируйте существующий файл.

# crontab -e [имя пользователя]

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

Не рекомендуется редактировать файл crontab напрямую, переходя в файловую систему и редактируя его вручную. Вместо этого лучше использовать crontab.

Почему мое задание Cron не запускается в установленное время?

  1. Проверьте, запущен ли daemon. Вы можете проверить, запущен ли он, выполнив команду systemctl status cron. Если он не запущен, вы можете запустить его с помощью systemctl start cron.
  2. Проверьте файл журнала. Его можно использовать для диагностики любых проблем. Проверка поможет узнать, есть ли какие-либо сообщения об ошибках или выполняется ли задание. Его можно найти по адресу /var/log/syslog.
  3. Проверьте права пользователя. Пользователь, выполняющий задание, должен иметь разрешение на выполнение команды. Если вы запускаете его от имени другого пользователя, убедитесь, что у пользователя есть необходимые разрешения для выполнения команды.
  4. Проверьте путь к файлу. Убедитесь, что путь к команде или сценарию указан правильно. Среда выполнения может отличаться от пользовательской оболочки.
  5. Проверьте синтаксис в файле crontab. Убедитесь, что в полях команда или время выполнения нет синтаксических ошибок.

Как проверить, что Cron Job выполняется успешно?

Проверьте состояние службы в Linux. Можно проверить состояние службы с помощью команды Linux. Откройте терминал Linux, нажав Ctrl + Alt + T. Используйте команду systemctl для проверки состояния:

sudo systemctl status cron

Другой способ понять, правильно ли работает крон, — изучить файлы журналов. Они хранятся в каталоге /var/log/syslog в Linux.

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