Перейти до змісту

Автоматизація процесів за допомогою 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 або користувача робочого столу. Це дозволяє вам автоматизувати завдання та сценарії, щоб вам не довелося запускати їх вручну. Більш складні приклади тут:

Хоча основи досить прості, варіанти можуть бути складнішими. Щоб дізнатися більше про crontab, перейдіть на сторінку довідника щодо crontab. У більшості систем ви також можете ввести man crontab для отримання додаткових деталей команди. Ви також можете здійснити пошук в Інтернеті за запитом "crontab", який дасть вам безліч результатів, які допоможуть вам вдосконалити свої навички crontab.

Author: Steven Spencer

Contributors: Ezequiel Bruni, Ganna Zhyrnova