Найти тему

Планировщик Cron для автоматизации действий на Linux-сервере

Оглавление

Давненько мы не говорили про работу с серверам, все о десктопе, да десктопе. Уверен, что среди читателей и подписчиков есть новички не только в мире Linux для домашнего использования, но и те, кто планирует связать (или уже связал) свою профессию с Linux и серверами. Для них (в первую очередь) адресован этот материал. Но! Пользу из него может извлечь любой пользователь Linux-дистрибутива, так как Cron вещь потрясающая в своей многофункциональности.

Можно получать уведомления о новых постах быстрее, чем их присылает Дзен. Для этого подпишитесь на обновления Просто Код в Телеграме.

Что такое Cron?

Это система для автоматического запуска программ и скриптов на сервере. Расшифровывается название как Command Run ON. Люди, глубже погруженные в Linux, скажут, что cron это классический демон для периодического выполнения заданий в определенное время. Ну а если по простому, то это штука, которая позволяет вам настроить на сервере запуск чего-то конкретного в определенный период.

Сценарии использования

На самом деле таковых вагон и несколько тележек. Но я расскажу про те сценарии, которые применял на работе:

  • резервное копирование базы данных и содержимого папок с сайтами
  • проверка антивирусом ClamAV корневого каталога и отправка сообщения в Телеграмм, если найдены инфицированные файлы (скрипт проверки писал я, потом заменили сообщения в Телеграме на оповещения по почте)
  • проверка запущенных сервисов и их запуск, если они по каким-то причинам остановились
  • проверка жестких дисков на ошибки и отправка оповещения, если что-то не так

Думаю, что опытные в этом деле подписчики смогут накидать в комментариях кучу других сценариев использования Cron, которые использовали они.

Как работать с Cron?

Описание того что и когда запускать находится в файле под названием crontab. Существует, по сути, две версии этого файла: версия, создаваемая для каждого пользователя в системе и версия, используемая всей системой. Редактировать эти файлы напрямую не рекомендуется, поэтому для добавления или редактирования задач Cron используется утилита crontab (называется также как и файл). Любой пользователь на сервере может посмотреть есть ли какие-либо задания, созданные от его имени. Для этого нужно использовать команду crontab -l.

-2

Как выглядит команда в Cron?

Синтаксис команд в Cron прост донельзя, главное один раз разобраться, несколько раз попробовать на практике и все встанет на свои места. Выглядит команда так:

1 2 3 4 5 /path/to/command arg1 arg2

Давайте разберемся какой элемент за что отвечает:

  • 1: Минуты (0-59)
  • 2: Часы (0-23)
  • 3: День (0-31)
  • 4: Месяц (0-12 [12 это декабрь])
  • 5: День недели (0-7 [7 или 0 это воскресенье])
  • /path/to/command — имя скрипта или команды для выполнения

Помимо синтаксиса используются так называемые операторы, которые позволяют указывать несколько значений в поле:

  • Оператор * (звездочка) означает «любое значение» или «всегда».
  • Оператор , (запятая) указывает на список значений для повторения.
  • Оператор - (дефис) указывает на диапазон значений.
  • Оператор / (слэш) указывает значения, которые будут повторяться в течение определенного интервала между ними.

Есть также предопределенные конструкции, которые заданы для конкретных отрезков и которые проще использовать:

  • @yearly (или @annually) запускает задание один раз в год в полночь (12:00) 1 января.
  • @monthly запускает задание один раз в месяц в полночь первого дня месяца.
  • @weekly запускает задание один раз в неделю в полночь воскресенья.
  • @daily запускает задание один раз в день в полночь.
  • @hourly запускает задание один раз в час в начале часа.
  • @reboot запускает задание при запуске системы (время загрузки).

Теперь если соединить все, что мы описали выше, то следующая строка

@hourly python3 main.py

будет запускать файл main.py (это файл Python) каждый час. Можно отказаться от предопределенных конструкции и тогда указать

0 * * * * python3 main.py

Согласитесь, что использование @hourly намного проще.

Добавляем команду в Cron

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

-3

Прежде чем создавать команду в Cron нужно сделать наш скрипт исполняемым. Для этого я введу команду chmod с ключом +x и указанием имени скрипта:

chmod +x everymin.sh

-4

Если выполнить теперь скрипт, то в папке моего сервера появится файл check.txt с указанием того, когда команду запустили.

-5

Создадим теперь команду Cron в которой укажем на необходимость запуска этого скрипта каждую минуту. И тут хочу дать маленький лайфхак новичкам по тому, как не запутаться в расписании команды: существуют специальные сервисы, которые позволят наглядно собрать периодичность запуска. Я использовал в свое время Crontab.guru, хотя уверен, что таких сервисов очень много. Он позволяет попробовать ввод различных вариантов времени запуска и в простом формате показывает как этот вариант будет запускаться. Изменяя значения в таких конструкторах вы быстро запомните как правильно составлять расписание. Для нашего же примера необходимо просто указать во всех параметрах звездочку.

-6

Открываем терминал и вводим crontab -e. После в открывшемся консольном текстовом редакторе вводим команду на запуск скрипта каждую минуту

* * * * * $HOME/everymin.sh

-7

Обратите внимание, что я указываю точное расположение скрипта, следите за этим внимательно, чтобы не было ошибок. Также не забывайте, что sh-скрипты должны быть исполняемыми, иначе ничего не запустится. После ввода команды Cron спросил меня каким консольным текстовым редактором я хочу воспользоваться (я выбрал nano).

Теперь проверим то, как работает наша команда. Для этого нам пригодится команда tail, про которую я рассказывал в статье про работу с файлами.

Команды для управления файлами в Linux

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

tail -f $HOME/check.txt

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

-8

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

Итоги

Теперь вы знаете, что такое Cron и представляете для чего его можно использовать на сервере. Давайте сведем всю информацию по основным командам воедино:

  • crontab -l покажет задания, созданные текущим пользователем
  • crontab -l -u <имя_пользователя> покажет задания, созданные другим пользователем
  • crontab -e откроет ваш crontab-файл для редактирования
  • crontab -r удалит ваш файл crontab со всеми задачи в нем
  • crontab -i сделает тоже самое, но спросит разрешения перед удалением
  • crontab -u <имя_пользователя> позволит изменить crontab-файл другого пользователя, но потребует пароль суперпользователя.

Я есть Рут! Суперпользователь в Linux-дистрибутивах

Cron является универсальным и повседневным инструментом в арсенале системного администратора. Я слышал, что для него существуют альтернативы, но пока что на всех серверах, с которыми я работал, планирование чего-либо осуществлялось через Cron.

Надеюсь, что материал оказался полезным для новичков и поможет им лучше разобраться в работе с Linux-серверами и планированием запуска каких-либо программ и скриптов. Если это так, то жду поддержки в виде лайков, комментариев и подписок!

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