Давненько мы не говорили про работу с серверам, все о десктопе, да десктопе. Уверен, что среди читателей и подписчиков есть новички не только в мире Linux для домашнего использования, но и те, кто планирует связать (или уже связал) свою профессию с Linux и серверами. Для них (в первую очередь) адресован этот материал. Но! Пользу из него может извлечь любой пользователь Linux-дистрибутива, так как Cron вещь потрясающая в своей многофункциональности.
Можно получать уведомления о новых постах быстрее, чем их присылает Дзен. Для этого подпишитесь на обновления Просто Код в Телеграме.
Что такое Cron?
Это система для автоматического запуска программ и скриптов на сервере. Расшифровывается название как Command Run ON. Люди, глубже погруженные в Linux, скажут, что cron это классический демон для периодического выполнения заданий в определенное время. Ну а если по простому, то это штука, которая позволяет вам настроить на сервере запуск чего-то конкретного в определенный период.
Сценарии использования
На самом деле таковых вагон и несколько тележек. Но я расскажу про те сценарии, которые применял на работе:
- резервное копирование базы данных и содержимого папок с сайтами
- проверка антивирусом ClamAV корневого каталога и отправка сообщения в Телеграмм, если найдены инфицированные файлы (скрипт проверки писал я, потом заменили сообщения в Телеграме на оповещения по почте)
- проверка запущенных сервисов и их запуск, если они по каким-то причинам остановились
- проверка жестких дисков на ошибки и отправка оповещения, если что-то не так
Думаю, что опытные в этом деле подписчики смогут накидать в комментариях кучу других сценариев использования Cron, которые использовали они.
Как работать с Cron?
Описание того что и когда запускать находится в файле под названием crontab. Существует, по сути, две версии этого файла: версия, создаваемая для каждого пользователя в системе и версия, используемая всей системой. Редактировать эти файлы напрямую не рекомендуется, поэтому для добавления или редактирования задач Cron используется утилита crontab (называется также как и файл). Любой пользователь на сервере может посмотреть есть ли какие-либо задания, созданные от его имени. Для этого нужно использовать команду crontab -l.
Как выглядит команда в 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
Теперь немного практики. На моем сервере я создал простой скрипт, который будет при запуске размещать в файл время запуска. Выглядит этот скрипт так:
Прежде чем создавать команду в Cron нужно сделать наш скрипт исполняемым. Для этого я введу команду chmod с ключом +x и указанием имени скрипта:
chmod +x everymin.sh
Если выполнить теперь скрипт, то в папке моего сервера появится файл check.txt с указанием того, когда команду запустили.
Создадим теперь команду Cron в которой укажем на необходимость запуска этого скрипта каждую минуту. И тут хочу дать маленький лайфхак новичкам по тому, как не запутаться в расписании команды: существуют специальные сервисы, которые позволят наглядно собрать периодичность запуска. Я использовал в свое время Crontab.guru, хотя уверен, что таких сервисов очень много. Он позволяет попробовать ввод различных вариантов времени запуска и в простом формате показывает как этот вариант будет запускаться. Изменяя значения в таких конструкторах вы быстро запомните как правильно составлять расписание. Для нашего же примера необходимо просто указать во всех параметрах звездочку.
Открываем терминал и вводим crontab -e. После в открывшемся консольном текстовом редакторе вводим команду на запуск скрипта каждую минуту
* * * * * $HOME/everymin.sh
Обратите внимание, что я указываю точное расположение скрипта, следите за этим внимательно, чтобы не было ошибок. Также не забывайте, что sh-скрипты должны быть исполняемыми, иначе ничего не запустится. После ввода команды Cron спросил меня каким консольным текстовым редактором я хочу воспользоваться (я выбрал nano).
Теперь проверим то, как работает наша команда. Для этого нам пригодится команда tail, про которую я рассказывал в статье про работу с файлами.
Команды для управления файлами в Linux
Если использовать у этой команды ключ -f, то она будет выводить последнее содержимое файла в фоновом режиме.
tail -f $HOME/check.txt
Остается дождаться истечения минуты и увидеть, что команда отрабатывает то, что мы хотели от нее.
Если мы заменим простенькое содержимое нашего файла, например, на создание резервной копии базы данных, которая создана на сервере и укажем периодичность запуска в неделю, то это уже будет полностью работоспособный и полезный сценарий использования.
Итоги
Теперь вы знаете, что такое Cron и представляете для чего его можно использовать на сервере. Давайте сведем всю информацию по основным командам воедино:
- crontab -l покажет задания, созданные текущим пользователем
- crontab -l -u <имя_пользователя> покажет задания, созданные другим пользователем
- crontab -e откроет ваш crontab-файл для редактирования
- crontab -r удалит ваш файл crontab со всеми задачи в нем
- crontab -i сделает тоже самое, но спросит разрешения перед удалением
- crontab -u <имя_пользователя> позволит изменить crontab-файл другого пользователя, но потребует пароль суперпользователя.
Я есть Рут! Суперпользователь в Linux-дистрибутивах
Cron является универсальным и повседневным инструментом в арсенале системного администратора. Я слышал, что для него существуют альтернативы, но пока что на всех серверах, с которыми я работал, планирование чего-либо осуществлялось через Cron.
Надеюсь, что материал оказался полезным для новичков и поможет им лучше разобраться в работе с Linux-серверами и планированием запуска каких-либо программ и скриптов. Если это так, то жду поддержки в виде лайков, комментариев и подписок!
Также напоминаю, что вы можете подписаться на обновления канала Просто Код в телеграмме и получать уведомления сразу же после выхода поста.