Автоматизація процесів за допомогою cron
і crontab
¶
Передумови¶
- Комп’ютер під керуванням Rocky Linux
- Зручно змінювати конфігураційні файли з командного рядка за допомогою вашого улюбленого редактора (тут використовуючи
vi
)
Припущення¶
- Базові знання bash, python або інших інструментів створення сценаріїв чи програмування, і ви хочете, щоб сценарій запускався автоматично
- Що ви працюєте як користувач root або перейшли на root за допомогою
sudo -s
** (Ви можете запускати певні сценарії у власних каталогах як власний користувач. У цьому випадку перехід на root не потрібний.)**
Вступ¶
Linux надає систему cron, планувальник завдань на основі часу, для автоматизації процесів. Він простий і водночас досить потужний. Хочете, щоб скрипт або програма запускалися щодня о 17:00? Тут ви це встановили.
crontab — це, по суті, список, до якого користувачі додають власні автоматизовані завдання та роботи, і він містить багато параметрів, які можуть ще більше спростити роботу. У цьому документі розглядатимуться деякі з них. Це гарна підтримка для тих, хто має певний досвід, а нові користувачі можуть додати систему cron
до своєї колекції.
anacron
коротко обговорюється тут із посиланням на «точкові» каталоги cron
. cron
працює за допомогою anacron
і корисний для машин, які не працюють постійно, наприклад робочих станцій і ноутбуків. Причина цього в тому, що хоча cron
виконує завдання за розкладом, якщо машина вимкнена, коли завдання заплановано, завдання не виконується. За допомогою anacron
завдання буде виконано, коли машина знову увімкнеться, навіть якщо запланований запуск був у минулому. Проте anacron
використовує більш рандомізований підхід до виконання завдань, коли час не є точним. Це має сенс для робочих станцій і ноутбуків, але не настільки для серверів. Це може бути проблемою для таких речей, як резервне копіювання сервера, наприклад, необхідність виконання завдання в певний час. Саме тут cron
пропонує найкраще рішення для адміністраторів серверів. Тим не менш, адміністратори серверів і користувачі робочих станцій або ноутбуків можуть отримати користь від обох підходів. Ви можете поєднувати та поєднувати залежно від ваших потреб. Щоб дізнатися більше про anacron
, перегляньте anacron – Автоматизація команд.
Почати легко - крапкові каталоги cron
¶
Каталоги cron
"dot", вбудовані в кожну систему Linux для багатьох версій, допомагають швидко автоматизувати процеси. Вони відображаються як каталоги, які система cron
викликає відповідно до умов іменування. Однак вони виконуються по-різному, залежно від процесу, призначеного для їх виклику, anacron
або cron
. Типовою поведінкою є використання anacron
, але це може змінити адміністратор сервера, робочої станції чи ноутбука.
Для серверів¶
Як зазначено у вступі, зараз cron
зазвичай запускає anacron
для виконання сценаріїв у цих «точкових» каталогах. Ви можете також захотіти використовувати ці "точкові" каталоги на серверах, і якщо це так, є два кроки, які ви можете зробити, щоб переконатися, що ці " dot" каталоги працюють за суворим графіком. Для цього вам потрібно встановити пакет і видалити інший:
dnf install cronie-noanacron
та
dnf remove cronie-anacron
Як і слід було очікувати, це видалить anacron
із сервера та повернеться до виконання завдань у «точкових» каталогах за суворим розкладом. /etc/cron.d/dailyjobs
— це файл, який керує розкладом і має такий вміст:
# Run the daily, weekly, and monthly jobs if cronie-anacron is not installed
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# run-parts
02 4 * * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.daily
22 4 * * 0 root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.weekly
42 4 1 * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.monthly
Це означає наступне:
- запускати сценарії в
cron.daily
о 04:02:00 щодня. - запускати сценарії в
cron.weekly
о 04:22:00 у неділю кожного тижня. - запускати сценарії в
cron.monthly
о 04:42:00 першого числа кожного місяця.
Для робочих станцій¶
Якщо ви хочете запустити сценарії на робочій станції чи ноутбуці в каталогах cron
«точка», нічого особливого не потрібно. Просто скопіюйте файл сценарію в відповідний каталог і переконайтеся, що він виконуваний. Ось довідники:
/etc/cron.hourly
– Сценарії, розміщені тут, запускатимуться на одну хвилину після години щогодини (це виконуєтьсяcron
незалежно від того, чиanacron
встановлено чи ні)/etc/cron.daily
– розміщені тут сценарії виконуватимуться щодня.anacron
налаштовує їх час (див. підказку)/etc/cron.weekly
– розміщені тут сценарії запускатимуться кожні 7 днів, залежно від календарного дня останнього виконання (див. підказку)/etc/cron.monthly
– сценарії, розміщені тут, запускатимуться щомісяця на основі календарного дня останнього часу виконання (див. підказку)
Підказка
Ймовірно, вони запускатимуться в однаковий (але не зовсім той самий) час щодня, тижня та місяця. Щоб дізнатися більше про час роботи, перегляньте @options нижче.
За умови, що ви вмієте просто дозволяти системі автоматично запускати ваші сценарії та дозволяти їм виконуватися певний час протягом зазначеного часу, це спрощує автоматизацію завдань.
Примітка
Не існує правила, згідно з яким адміністратор сервера не може використовувати рандомізований час виконання, який anacron
використовує для запуску сценаріїв у каталогах "точка". Випадком використання для цього буде сценарій, який не залежить від часу.
Створення власного cron
¶
Якщо автоматизований рандомізований час не працює належним чином у розділі Для робочих станцій вище, а запланований час у розділі Для серверів вище , тоді ви зможете створити свій власний. У цьому прикладі ми припускаємо, що ви робите це як root. див. Припущення Для цього введіть наступне:
crontab -e
Це призведе до відкриття crontab
root-користувача, який існує на даний момент у вибраному редакторі, і може виглядати приблизно так. Прочитайте цю версію з коментарями, оскільки вона містить описи кожного поля, яке ми будемо використовувати далі:
# Відредагуйте цей файл, щоб представити завдання, які виконуватиме cron.
#
# Кожне завдання для запуску має бути визначено в одному рядку
# вказуючи різними полями, коли завдання буде запущено
# і яку команду виконати для завдання
#
# Щоб визначити час, ви можете надати конкретні значення
# хвилина (м), година (год), день місяця (дом), місяць (пн),
# і день тижня (dow) або використовуйте «*» у цих полях (для «будь-якого»).
#
# Зверніть увагу, що завдання будуть запускатися на основі системи cron
# поняття daemon про час і часові пояси.
#
# Вихідні дані завдань crontab (включаючи помилки) надсилаються
# електронним листом користувачу, якому належить файл crontab (якщо не перенаправлено).
# cron
# Наприклад, ви можете створити резервну копію всіх ваших облікових записів користувачів
# о 5:00 щотижня з:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# Для отримання додаткової інформації дивіться сторінки посібника crontab(5) і cron(8)
#
Команда # m h dom mon dow
Зауважте, що цей конкретний файл crontab
має частину вбудованої документації. Це не завжди так. Під час модифікації crontab
у контейнерній або мінімалістичній операційній системі crontab
буде порожнім файлом, якщо в ньому немає запису.
Припустімо, що у вас є сценарій резервного копіювання, який ви хочете запустити о 10 вечора. crontab
використовує 24-годинний годинник, це буде 22:00. Припустімо, що сценарій резервного копіювання називається «резервне копіювання» і наразі він знаходиться в каталозі /usr/local/sbin.
Примітка
Пам’ятайте, що цей скрипт також має бути виконуваним (chmod +x
), щоб cron
міг його запустити.
Щоб перелічити поточну роботу, запустіть:
crontab -l
Перелічити всі роботи, створені користувачем:
crontab -l -u <username>
Щоб додати роботу, ви:
crontab -e
crontab
розшифровується як "cron table", а формат файлу фактично є розкладним макетом таблиці. Тепер, коли ви перебуваєте в crontab
, перейдіть у нижню частину файлу та додайте новий запис. Якщо ви використовуєте vi
як системний редактор за замовчуванням, це робиться за допомогою наступних клавіш:
Shift+:+$
Тепер, коли ви знаходитесь у нижній частині файлу, вставте рядок і введіть короткий коментар, щоб описати, що відбувається з вашим записом. Це можна зробити, додавши "#" на початку рядка:
# Backing up the system every night at 10PM
Натисніть Enter. Ви все ще маєте бути в режимі вставки, тому наступним кроком є додавання вашого запису. Як показано в crontab
з порожнім коментарем (вище), це m для хвилин, h для годин, dom для дня місяця, mon для місяця та dow для дня тижня.
Щоб запускати наш сценарій резервного копіювання щодня о 10:00, запис повинен мати наступний вигляд:
00 22 * * * /usr/local/sbin/backup
Це говорить про те, що сценарій потрібно запускати о 22:00 кожного дня місяця, кожного місяця та кожного дня тижня. Це спрощений приклад, і все може стати досить складним, коли вам потрібні деталі.
@options для crontab
¶
Ще один спосіб виконання завдань у строго запланований час (тобто день, тиждень, місяць, рік тощо) — це використання @options, які пропонують можливість використовувати більш природний час. @options складається з:
@hourly
запускає сценарій щогодини щодня о 0 хвилин після години (це саме результат розміщення вашого сценарію також у/etc/cron.hourly
).@daily
запускає сценарій щодня опівночі.@weekly
запускає сценарій щотижня опівночі неділі.@monthly
запускає сценарій кожного місяця опівночі першого дня місяця.@yearly
запускає сценарій кожного року опівночі першого січня.@reboot
запускає сценарій лише під час запуску системи.
Примітка
Використання цих записів crontab
обходить систему anacron
і повертається до crond.service
незалежно від того, встановлено anacron
чи ні.
Для нашого прикладу сценарію резервного копіювання, якщо ми використовуємо параметр @daily для запуску сценарію резервного копіювання опівночі, запис виглядатиме так:
@daily /usr/local/sbin/backup
Більш складні варіанти¶
Поки що використовувалися досить спрощені рішення, але як щодо складніших часових розкладів? Скажімо, ви хочете запускати сценарій резервного копіювання кожні 10 хвилин протягом дня (ймовірно, це не практично, але це приклад!). Для цього ваш crontab повинен бути таким:
*/10 * * * * /usr/local/sbin/backup
Що робити, якщо ви хочете виконувати резервне копіювання кожні 10 хвилин, але лише в понеділок, середу та п’ятницю?:
*/10 * * * 1,3,5 /usr/local/sbin/backup
А як щодо кожні 10 хвилин щодня, крім суботи та неділі?:
*/10 * * * 1-5 /usr/local/sbin/backup
У таблиці коми дозволяють вказати окремі записи в полі, а тире — діапазон значень у полі. Це вірно для будь-якого з полів і може бути вірним для багатьох полів одночасно. Як бачите, все може стати досить складним.
Визначаючи, коли запускати сценарій, потрібно приділити час і спланувати його, особливо якщо критерії складні.
Висновки¶
Система cron/crontab є потужним інструментом для системного адміністратора Rocky Linux або користувача робочого столу. Це дозволяє вам автоматизувати завдання та сценарії, щоб вам не довелося запускати їх вручну. Більш складні приклади тут:
- Для машин, які не працюють 24 години на добу, дослідіть anacron - Автоматизація команд.
- Для короткого опису процесів
cron
перегляньте cronie - Тимчасові завдання
Хоча основи досить прості, варіанти можуть бути складнішими. Щоб дізнатися більше про crontab
, перейдіть на сторінку довідника щодо crontab. У більшості систем ви також можете ввести man crontab
для отримання додаткових деталей команди. Ви також можете здійснити пошук в Інтернеті за запитом "crontab", який дасть вам безліч результатів, які допоможуть вам вдосконалити свої навички crontab
.
Author: Steven Spencer
Contributors: Ezequiel Bruni, Ganna Zhyrnova