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

Автоматизація процесів за допомогою cron і crontab

Передумови

  • Комп’ютер під керуванням Rocky Linux
  • Зручно змінювати конфігураційні файли з командного рядка за допомогою вашого улюбленого редактора (тут використовуючи vi)

Припущення

  • Базові знання bash, python або інших інструментів створення сценаріїв чи програмування, і ви хочете, щоб сценарій запускався автоматично
  • Що ви запускаєте систему від імені користувача root або маєте можливість sudo -s
    (Ви можете запускати певні скрипти у власних каталогах від імені власного користувача. У цьому випадку перехід на root-доступ не потрібен.)

Вступ

Linux надає систему cron, планувальник завдань на основі часу, для автоматизації процесів. Він простий і водночас досить потужний. Хочете, щоб скрипт або програма запускалися щодня о 17:00? Тут ви це встановили.

Crontab — це, по суті, список, куди користувачі додають власні автоматизовані завдання та проекти, і він має багато опцій, які можуть ще більше спростити процес. У цьому документі розглядатимуться деякі з них. Це гарне оновлення знань для тих, хто має певний досвід, а нові користувачі можуть додати систему cron до свого інструментарію.

Тут коротко обговорюється anacron стосовно каталогів cron типу "dot". Команда cron запускається за допомогою anacron і корисна для машин, які не працюють постійно, таких як робочі станції та ноутбуки. Причина цього полягає в тому, що хоча cron виконує завдання за розкладом, якщо машина вимкнена в запланований час, завдання не виконується. З anacron завдання буде виконано, коли машина знову ввімкнеться, навіть якщо запланований запуск був у минулому. Однак anacron використовує більш рандомізований підхід до виконання завдань, де час не є точним. Це має сенс для робочих станцій і ноутбуків, але не настільки для серверів. Це може бути проблемою для таких речей, як резервне копіювання сервера, наприклад, необхідність виконання завдання в певний час. Саме тут cron пропонує найкраще рішення для адміністраторів серверів. Тим не менш, адміністратори серверів і користувачі робочих станцій або ноутбуків можуть отримати користь від обох підходів. Ви можете поєднувати та поєднувати залежно від ваших потреб. Більше про anacron див. anacron - Автоматизація команд.

Почати легко - крапкові каталоги cron

Вбудовані в кожну систему Linux для багатьох версій, каталоги cron "dot" допомагають швидко автоматизувати процеси. Вони відображаються як каталоги, які система cron викликає на основі їхніх правил іменування. Однак вони працюють по-різному, залежно від процесу, призначеного для їх виклику, anacron або cron. За замовчуванням використовується anacron, але адміністратор сервера, робочої станції або ноутбука може змінити це.

Для серверів

Як зазначено у вступі, cron зазвичай запускає anacron у наші дні для запуску скриптів у цих каталогах типу "dot". Ви можливо захочете використовувати ці каталоги "dot" також на серверах, і якщо це так, то потрібно виконати два кроки, щоб перевірити, чи ці каталоги "dot" працюють за суворим розкладом. Для цього вам потрібно встановити пакет і видалити інший:

dnf install cronie-noanacron

та

dnf remove cronie-anacron

Як і слід було очікувати, це видаляє anacron із сервера та повертає завдання до виконання в каталогах "dot" за суворим розкладом. /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 "dot", вам не потрібно робити нічого складного. Просто скопіюйте файл сценарію в відповідний каталог і переконайтеся, що він виконуваний. Ось довідники:

  • /etc/cron.hourly – Сценарії, розміщені тут, запускатимуться на одну хвилину після години щогодини (це виконується cron незалежно від того, чи anacron встановлено чи ні)
  • /etc/cron.daily – Скрипти, розміщені тут, будуть виконуватися щодня. anacron налаштовує час їх виконання (див. пораду)
  • /etc/cron.weekly – розміщені тут сценарії запускатимуться кожні 7 днів, залежно від календарного дня останнього виконання (див. підказку)
  • /etc/cron.monthly – сценарії, розміщені тут, запускатимуться щомісяця на основі календарного дня останнього часу виконання (див. підказку)

Tip

Ймовірно, вони запускатимуться в однаковий (але не зовсім той самий) час щодня, тижня та місяця. Щоб дізнатися більше про час роботи, перегляньте @options нижче.

За умови, що ви вмієте просто дозволяти системі автоматично запускати ваші сценарії та дозволяти їм виконуватися певний час протягом зазначеного часу, це спрощує автоматизацію завдань.

Note

Не існує правила, згідно з яким адміністратор сервера не може використовувати рандомізований час виконання, який anacron використовує для запуску сценаріїв у каталогах "точка". Випадком використання для цього буде сценарій, який не залежить від часу.

Створення власного cron

Ви можете створити власний, якщо автоматизований рандомізований час не підходить для робочих станцій або запланований час для серверів. У цьому прикладі ми припускаємо, що ви робите це як root. Для цього введіть наступне:

crontab -e

Це відкриє crontab користувача root у його поточному вигляді у вибраному вами редакторі, і він може виглядати приблизно так. Прочитайте цю версію з коментарями, оскільки вона містить описи кожного поля, яке ми будемо використовувати далі:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# cron
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

Зверніть увагу, що цей конкретний файл crontab має власну вбудовану документацію. Це не завжди так. Під час зміни crontab у контейнері або мінімалістичній операційній системі, crontab буде порожнім файлом, якщо в ньому немає запису.

Припустімо, що у вас є сценарій резервного копіювання, який ви хочете запустити о 10 вечора. crontab використовує 24-годинний формат часу, це буде 22:00. Припустимо, що ваш скрипт резервного копіювання має назву "backup" і що він зараз знаходиться в каталозі /usr/local/sbin.

Note

Пам’ятайте, що цей скрипт також має бути виконуваним (chmod +x), щоб cron міг його запустити.

Щоб перелічити поточну роботу, запустіть:

crontab -l

Перелічити всі роботи, створені користувачем:

crontab -l -u <username>

Щоб додати роботу, ви:

crontab -e

crontab розшифровується як «cron table» (таблиця cron), а формат файлу насправді є вільним табличним форматом. Тепер, коли ви знаходитесь у crontab, перейдіть до кінця файлу та додайте свій запис. Якщо ви використовуєте vi як системний редактор за замовчуванням, ви зробите це за допомогою таких клавіш:

++shift+colon+"$"++

Тепер, коли ви знаходитесь у нижній частині файлу, вставте рядок і введіть короткий коментар, щоб описати, що відбувається з вашим записом. Це можна зробити, додавши "#" на початку рядка:

# Резервне копіювання системи щовечора о 22:00

Натисніть 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 запускає сценарій лише під час запуску системи.

Note

Використання цих записів 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