Вступление
При управлении компьютером мы можем автоматизировать выполнение некоторых задач в определенные периоды или в одно и то же время каждый день / неделю / месяц. На настольном компьютере мы можем запланировать проверку обновлений или сканирование на вирусы. На сервере нередко приходится планировать множество процедур проверки и очистки, чтобы гарантировать оптимальную работу приложений.
В этой статье мы рассмотрим программу cron
. Эта утилита представляет
собой планировщик задач для Unix-подобных систем. Пройдя по основам
cron, мы рассмотрим команду crontab
для управления нашими
запланированными задачами.
Что такое Крон? Что такое Crontab?
Чтобы освоить cron
и планирование, полезно иметь представление о
различной, но схожей терминологии.
Cron - это программа, которая планирует запуск скриптов или команд в указанное пользователем время. Выражение cron - это строка, которая детализирует расписание для запуска команды. Таблица cron - это файл конфигурации, содержащий команды оболочки в каждой строке, которой предшествует выражение cron.
Вот изображение с системным crontab, которое ссылается на два внешних скрипта:
Обычно таблицы cron выглядят так:
<cron-expression> <command>
<cron-expression> <command>
Когда ваш компьютер впервые запускается, cron ищет все crontab в
каталогах, настроенных системой. Каталог варьируется от ОС к ОС, но
обычно это /etc/crontab
для специальных общесистемных crontab и
локальный каталог для пользователя, который вошел в систему. Оба они
загружаются в память.
Программа cron просыпается каждую минуту и проверяет crontab в памяти, чтобы узнать, нужно ли запускать какие-либо команды в текущую минуту. Он выполняет все запланированные команды и снова засыпает.
Есть два метода планирования заданий cron:
- Отредактируйте
crontab
напрямую
Мы можем просмотреть запланированные нами задания cron, выполнив эту команду:
$ crontab -l
Если мы хотим добавить или отредактировать задание cron, мы можем использовать эту команду:
$ crontab -e
Это предпочтительный метод редактирования crontab, поскольку он выбирает пользовательский crontab, а не системный, а также выявляет синтаксические ошибки.
- Копирование скриптов в каталоги
/etc/cron.*
Если планирование сценариев для точных временных интервалов не требуется, сценарии также можно перемещать в определенные предварительно созданные папки расписания cron, чтобы crontab мог забрать их для выполнения. Эти предопределенные каталоги, которые действуют как заполнители, включают:
Место расположения График выполнения
/etc/cron.hourly/ Раз в час /etc/cron.daily/ Один раз в день, каждый день /etc/cron.monthly/ Раз в месяц, каждый месяц /etc/cron.weekly/ Раз в неделю, каждую неделю
Пользователи могут копировать свои сценарии в соответствующие каталоги в
зависимости от того, с какой периодичностью их запускать. Файл crontab,
представленный в /etc/crontab
содержит выражения cron, определенные
для каждого каталога, и каждую минуту проверяет, подходит ли время для
выполнения сценариев:
{.ezlazyload}
Обратите внимание, что сценарии, помещенные в эти специальные папки, являются общесистемными заданиями cron, а не пользовательскими.
Создание выражения Cron
Каждая запись crontab содержит выражение cron, имя пользователя и команду, которую нужно выполнить, разделенные пробелами или табуляциями:
* * * * * user-name command-or-file-to-be-executed
# <-----------> <-------> <---------------------------->
# Cron
# Expression
Примечание . user-name
используется при редактировании
общесистемного crontab. Специфичный для пользователя crontab не нужен,
потому что эта информация уже известна.
5 звездочек ( * * * * *
) в выражении cron можно заменить числами. Их
позиции указывают на их ценность:
* Должность Описание Допустимые числовые значения
1 Минуты 0–59 2 Час 0–23 3 День месяца 1-31 4 Месяц 0–12 5 День недели [0 означает воскресенье, а суббота - 6] 0-6
Помимо чисел, есть специальные символы, которые мы можем использовать при редактировании crontab:
Символы Описание
* Определение этого будет запускать команду для каждого временного интервала. Например, *, определенный в столбце минут, скрипт будет выполняться каждую минуту. , Чтобы повторить задачу в нескольких разных временных рамках, можно использовать запятые. Например, чтобы запускать сценарий каждые 10 минут, столбец минут можно задать как 0,10,20,30,40,50. / Альтернативный, более простой вариант ",". Чтобы запускать скрипт каждые 10 минут, столбец минут можно указать как * / 10. - Задает диапазон значений. Чтобы запускать скрипт каждую минуту в течение первых 10 минут, выражение в столбце минут может быть представлено как: 0-10
Есть много вариантов, которые нужно понять, возможно, лучше всего показать, как они работают, на нескольких примерах:
- Вот как запустить
echo "hello there!"
«4-й день каждой недели» (т.е. в четверг) в 12:10:
|
|
10 12 * * 4 root echo "hello there!"
- А вот более сложный пример, в котором мы сохраняем использование диска каждые 20 минут в первые 10 дней последних трех месяцев года:
|
|
*/20 * 1-10 10,11,12 * df -h >> /tmp/diskusage
Выражения Cron на первый взгляд могут показаться ошеломляющими. В
Интернете доступно множество инструментов для упрощения создания
выражений; crontab.guru
- один из широко популярных инструментов,
доступных в Интернете по адресу https://crontab.guru/ .
Давайте воспользуемся crontab.guru, чтобы проверить, действителен ли наш второй экспресс: https://crontab.guru/#*/20_*_1-10_10,11,12_* .
{.ezlazyload}
Практическое руководство: создание задания Cron для отправки по электронной почте диска и использования памяти
В ИТ-отделе системные администраторы и другие операторы часто контролируют ресурсы компьютера, такие как память и размер диска. Crontab обычно используется для обеспечения непрерывного выполнения сценариев мониторинга.
Мы собираемся создать задание cron, которое отслеживает использование диска и оперативной памяти с помощью Watchmon . Если какой-либо из показателей превышает определенный порог, мы получим уведомление по электронной почте. Мы поместим этот скрипт в задание cron, которое запускается каждую минуту.
Следующая демонстрация была протестирована на Ubuntu 20.04.1 LTS
.
Этот пример настроен для отправки электронной почты в учетную запись
Gmail, вам может потребоваться настроить ваши конфигурации для других
поставщиков электронной почты.
- Сначала вам нужно установить watchmon. Следуйте их README, чтобы узнать, как его настроить:
|
|
> git clone https://github.com/datawrangl3r/watchmon
> cd watchmon
> bash setup.sh
- Сценарий запустит процесс cron, установит http://www.mutt.org/ ,
SMTP-клиент командной строки, для отправки электронных писем. После
установки используйте текстовый редактор для
mutt.rc
в вашем домашнем каталоге:/home/user/mutt/mutt.rc
.
Отредактируйте файл так, чтобы он выглядел следующим образом, изменив данные шаблона с помощью вашего электронного письма:
set ssl_starttls=yes
set ssl_force_tls=yes
set imap_user = " [email protected] "
set imap_pass = "PASSWORD"
set from=" [email protected] "
set realname="Your Name"
set folder = "imaps://imap.gmail.com/"
set spoolfile = "imaps://imap.gmail.com/INBOX"
set postponed="imaps://imap.gmail.com/[Gmail]/Drafts"
set header_cache = "~/.mutt/cache/headers"
set message_cachedir = "~/.mutt/cache/bodies"
set certificate_file = "~/.mutt/certificates"
set smtp_url = "smtps:// [email protected] : [email protected] :465/"
set move = no
set imap_keepalive = 900
- Поскольку Google не позволяет своим службам быть доступными для менее безопасных приложений, нам необходимо разрешить доступ для учетной записи электронной почты, которая будет использоваться в настройках SMTP. Посетите https://myaccount.google.com/security и включите для менее безопасного доступа доступ к приложениям, как показано на гифке ниже:
{.ezlazyload}
- Теперь, когда наши сценарии и конфигурации учетной записи электронной почты готовы, мы можем настроить наш crontab. Отредактируйте ваш crontab, вызвав:
|
|
$ crontab -e
Теперь введите соответствующее выражение cron и путь к исполняемому файлу с аргументами. Обратите внимание, что путь на вашем компьютере будет отличаться от того, что показано ниже:
* * * * * /mnt/c/Users/sathy/Documents/datawrangler/watchmon/watchmon.sh -t=40 [email protected]
Это можно настроить, как показано ниже:
{.ezlazyload}
Утилита cron обеспечивает выполнение сценария каждую минуту, и в результате с машины отправляется электронное письмо получателям до тех пор, пока не будет очищено дисковое пространство или память машины.
Работа в Cron и устранение сбоев
Хотя crontab очень мощные, они не могут предупредить пользователя, если
базовое задание не запущено или запланированный исполняемый файл
обнаруживает ошибку. Журналы для каждого запуска задания можно найти в
файле /var/log/syslog
Обязательно просмотрите свои журналы после того,
как запланированы действия.
Помимо ошибок cron и команд, многие crontab страдают от человеческих ошибок. При настройке заданий cron, вот несколько распространенных причин, по которым ваше задание cron может работать не так, как вы ожидали:
-
У скриптов нет разрешения на выполнение. Те исполняемые файлы, которые должны запускаться как задания cron, должны иметь разрешение
755
т.е. rwx-rw-rw. Утилита cron может выполнять сценарии только в том случае, если у пользователя есть для нее разрешения на выполнение. -
Crontab синтаксически правильный, но для заданий использовался неправильный путь. Важно указать абсолютный путь к исполняемому файлу и самой команде. Относительных путей следует избегать любой ценой.
-
Команда или сценарий не запускаются с переменными среды, необходимыми для работы. В этих случаях убедитесь, что запускаемый вами сценарий может настроить необходимые переменные env при запуске в качестве задания cron.
Заключение
В этой статье мы рассмотрели программу cron, выражения cron и crontab.
Мы использовали команду crontab
для отображения и редактирования
заданий cron. Crontab - одни из лучших инструментов для Unix-подобных
систем для автоматизации повторяющихся задач. Что бы вы запланировали с
работой cron?