107.2 Урок 1
Сертифікат: |
LPIC-1 |
---|---|
Версія: |
5.0 |
Роздл: |
107 Адміністративні завдання |
Тема: |
107.2 Автоматизація завдань системного адміністрування, планування завдань |
Урок: |
1 з 2 |
Вступ
Одним із найважливіших завдань фахового системного адміністратора є планування завдань, які потрібно виконувати на регулярній основі. Наприклад, адміністратор може створювати та автоматизувати завдання для резервного копіювання, оновлення системи та виконання багатьох інших дій, що повторюються. Щоб зробити це, ви можете використати засіб cron
, який корисний для автоматизації планування періодичних завдань.
Планування завдання за допомогою Cron
У Linux cron
— це демон, який працює безперервно та прокидається щохвилини, щоб перевірити набір таблиць і знайти завдання для виконання. Ці таблиці відомі як crontabs і містять так звані завдання cron. Cron підходить для серверів і систем, які постійно увімкнені, тому що кожне завдання cron виконується, лише якщо система працює в запланований час. Його можуть використовувати звичайні користувачі, кожен з яких має власний crontab
, а також користувач root, який керує системними crontab.
Note
|
У Linux також є функція |
Користувацькі Crontabs
Користувацькі crontabs — це текстові файли, які керують плануванням визначених користувачем завдань cron. Вони завжди називаються за обліковим записом користувача, який їх створив, але розташування цих файлів залежить від дистрибутива, що використовується (зазвичай це підкаталог /var/spool/cron
).
Кожен рядок crontab користувача містить шість полів, розділених пробілом:
-
Хвилина години (0-59).
-
Година доби (0-23).
-
День місяця (1-31).
-
Місяць року (1-12).
-
День тижня (0-7 з неділею=0 або неділею=7).
-
Команда для запуску.
Для місяця року та дня тижня можна використовувати перші три літери назви замість відповідної цифри.
Перші п’ять полів вказують, коли потрібно виконати команду, указану в шостому полі, і вони можуть містити одне або кілька значень. Зокрема, ви можете вказати кілька значень за допомогою:
*
(зірочка)-
Посилається на будь-яке значення.
,
(кома)-
Визначає список можливих значень.
-
(дефіс)-
Визначає діапазон можливих значень.
/
(коса риска)-
Визначає покрокові значення.
Багато дистрибутивів містять файл /etc/crontab
, який можна використовувати як довідник для шаблону файлу cron
. Ось приклад файлу /etc/crontab
з дистрибутиву Debian:
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
Системні Crontabs
Системні crontabs — це текстові файли, які керують плануванням системних завдань cron і можуть редагуватися лише користувачем root. /etc/crontab
і всі файли в каталозі /etc/cron.d
є системними crontab.
Більшість дистрибутивів також включають каталоги /etc/cron.hourly
, /etc/cron.daily
, /etc/cron.weekly
та /etc/cron.monthly
, які містять сценарії для запуску з відповідною частотою. Наприклад, якщо ви хочете запускати сценарій щодня, ви можете розмістити його в /etc/cron.daily
.
Warning
|
Деякі дистрибутиви використовують |
Синтаксис системних crontabs подібний до синтаксису користувацьких crontabs, однак також вимагає додаткового обов’язкового поля, яке вказує, який користувач виконуватиме завдання cron. Таким чином, кожен рядок системного crontab містить сім полів, розділених пробілом:
-
Хвилина години (0-59).
-
Година доби (0-23).
-
День місяця (1-31).
-
Місяць року (1-12).
-
День тижня (0-7 з неділею=0 або неділею=7).
-
Ім’я облікового запису користувача, який буде використовуватися під час виконання команди.
-
Команда для запуску.
Що стосується crontab користувача, ви можете вказати кілька значень для полів часу за допомогою операторів *
, ,
, -
і /
. Ви також можете вказати місяць року та день тижня першими трьома літерами назви замість відповідної цифри.
Специфікації конкретного часу
Під час редагування файлів crontab ви також можете використовувати спеціальні ярлики в перших п’яти стовпцях замість визначення конкретного часу:
@reboot
-
Запускати вказане завдання один раз після перезавантаження.
@hourly
-
Запускати вказане завдання раз на годину на початку години.
@daily
(або@midnight
)-
Запускати вказане завдання раз на день опівночі.
@weekly
-
Запускати вказане завдання раз на тиждень опівночі в неділю.
@monthly
-
Запускати вказане завдання раз на місяць опівночі першого дня місяця.
@yearly
(або@annually
)-
Запускати вказане завдання один раз на рік опівночі 1 січня.
Змінні Crontab
У файлі crontab іноді є призначення змінних, які визначаються перед оголошенням запланованих завдань. Зазвичай встановлюються такі змінні середовища:
HOME
-
Каталог, де
cron
викликає команди (за замовчуванням домашній каталог користувача). MAILTO
-
Ім’я користувача або адреса, на яку надсилається стандартний вивід і помилка (за замовчуванням власник crontab). Кілька значень, розділених комами, також дозволені, а порожнє значення вказує на те, що пошту не слід надсилати.
PATH
-
Шлях, де можна знайти команди.
SHELL
-
Оболонка, що використовується (за умовчанням
/bin/sh
).
Створення завдань користувача Cron
Команда crontab
використовується для підтримки файлів crontab для окремих користувачів. Зокрема, ви можете запустити команду crontab -e
, щоб відредагувати свій власний файл crontab або створити його, якщо він ще не існує.
$ crontab -e no crontab for frank - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ‑‑‑‑ easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
За замовчуванням команда crontab
відкриває редактор, визначений змінними середовища VISUAL
або EDITOR
, щоб ви могли почати редагувати свій файл crontab за допомогою бажаного редактора. Деякі дистрибутиви, як показано в прикладі вище, дозволяють вибрати редактор зі списку, коли crontab
запускається вперше.
Якщо ви хочете запускати сценарій foo.sh
, який знаходиться у вашому домашньому каталозі щодня о 10:00 ранку, ви можете додати такий рядок до свого файлу crontab:
0 10 * * * /home/frank/foo.sh
Розглянемо наступні приклади записів crontab:
0,15,30,45 08 * * 2 /home/frank/bar.sh 30 20 1-15 1,6 1-5 /home/frank/foobar.sh
У першому рядку скрипт bar.sh
виконується щовівторка о 08:00, о 08:15, о 08:30 та о 08:45. У другому рядку сценарій foobar.sh
виконується о 20:30 з понеділка по п’ятницю протягом перших п’ятнадцяти днів січня та червня.
Warning
|
Хоча файли crontab можна редагувати вручну, завжди рекомендується використовувати команду |
На додаток до параметра -e
, згаданого вище, команда crontab
має інші корисні параметри:
-l
-
Відображає поточний crontab у стандартному виведенні.
-r
-
Видаляє поточний crontab.
-u
-
Визначає ім’я користувача, crontab якого потрібно змінити. Цей параметр потребує привілеїв root і дозволяє користувачеві root редагувати файли користувача crontab.
Створення системних завдань Cron
На відміну від користувацьких crontab, системні crontab оновлюються за допомогою редактора: тому вам не потрібно запускати команду crontab
, щоб редагувати /etc/crontab
та файли в /etc/cron.d
. Пам’ятайте, що під час редагування системних crontabs ви повинні вказати обліковий запис, який використовуватиметься для запуску завдання cron (зазвичай користувач root).
Наприклад, якщо ви хочете запускати сценарій barfoo.sh
, розташований у каталозі /root
щодня о 01:30 ночі, ви можете відкрити /etc/crontab
за допомогою редактора, якому ви віддаєте перевагу, і додати такий рядок:
30 01 * * * root /root/barfoo.sh >>/root/output.log 2>>/root/error.log
У наведеному вище прикладі вихідні дані завдання додаються до /root/output.log
, тоді як помилки додаються до /root/error.log
.
Warning
|
Якщо вихідні дані не перенаправляються у файл, як у наведеному вище прикладі (або для змінної |
Налаштування доступу до планування завдань
У Linux файли /etc/cron.allow
і /etc/cron.deny
використовуються для встановлення обмежень crontab
. Зокрема, вони використовуються для дозволу або заборони планування завдань cron для різних користувачів. Якщо /etc/cron.allow
існує, лише некореневі користувачі, перелічені в ньому, можуть планувати завдання cron за допомогою команди crontab
. Якщо /etc/cron.allow
не існує, але /etc/cron.deny
існує, лише не-root користувачі, перелічені в цьому файлі, не можуть планувати завдання cron за допомогою команди crontab
(у цьому випадку порожній / etc/cron.deny
означає, що кожному користувачеві дозволено планувати завдання cron за допомогою crontab
). Якщо жоден із цих файлів не існує, доступ користувача до планування завдань cron залежить від дистрибутива, що використовується.
Note
|
Файли |
Альтернатива Cron
Використовуючи systemd як менеджер системи та послуг, ви можете встановити timers як альтернативу cron
для планування своїх завдань. Таймери — це системні файли одиниць, ідентифіковані суфіксом .timer
, і для кожного з них повинен існувати відповідний unit-файл, який описує unit, який буде активований після закінчення таймера. За замовчуванням timer
активує службу з такою ж назвою, за винятком суфікса.
Таймер містить розділ [Timer]
, який визначає час виконання запланованих завдань. Зокрема, ви можете використовувати опцію OnCalendar=
, щоб визначити таймери реального часу, які працюють так само, як і завдання cron (вони базуються на виразах подій календаря). Параметр OnCalendar=
вимагає такого синтаксису:
DayOfWeek Year-Month-Day Hour:Minute:Second
Параметр DayOfWeek
є необов’язковим. Оператори *
, /
і ,
мають те саме значення, що й ті, що використовуються для завдань cron, тоді як ви можете використовувати ..
між двома значеннями, щоб позначити безперервний діапазон. Для специфікації DayOfWeek
ви можете використовувати перші три літери назви або повну назву.
Note
|
Ви також можете визначити монотонні таймери, які активуються через деякий час, що минув із певної початкової точки (наприклад, коли машина завантажилася або коли сам таймер активовано). |
Наприклад, якщо ви хочете запустити службу під назвою /etc/systemd/system/foobar.service
о 05:30 першого понеділка кожного місяця, ви можете додати наступні рядки у відповідний unit-файл /etc/systemd/system/foobar.timer
.
[Unit] Description=Run the foobar service [Timer] OnCalendar=Mon *-*-1..7 05:30:00 Persistent=true [Install] WantedBy=timers.target
Створивши новий таймер, ви можете ввімкнути його та запустити, виконавши наступні команди від імені root:
# systemctl enable foobar.timer # systemctl start foobar.timer
Ви можете змінити частоту запланованого завдання, змінивши значення OnCalendar
, а потім ввівши команду systemctl daemon-reload
.
Нарешті, якщо ви бажаєте переглянути список активних таймерів, упорядкованих за часом закінчення, ви можете скористатися командою systemctl list-timers
. Ви можете додати опцію --all
, щоб також бачити неактивні таймери.
Note
|
Пам’ятайте, що таймери реєструються в журналі systemd, і ви можете переглядати журнали різних модулів за допомогою команди |
Замість довшої нормалізованої форми, згаданої вище, ви можете використовувати деякі спеціальні вирази, які описують конкретні частоти для виконання завдання:
hourly
-
Запускати вказане завдання раз на годину на початку години.
daily
-
Запускати вказане завдання раз на день опівночі.
weekly
-
Запускати вказане завдання раз на тиждень опівночі понеділка.
monthly
-
Запускати вказане завдання раз на місяць опівночі першого дня місяця.
yearly
-
Запускати вказане завдання раз на рік опівночі першого січня.
Повний перелік специфікацій часу та дати можна переглянути на man-сторінках у systemd.timer(5)
.
Вправи до посібника
-
Для кожного з наступних ярликів
crontab
вкажіть відповідну специфікацію часу (тобто перші п’ять стовпців у файліcrontab
користувача):@hourly
@daily
@weekly
@monthly
@annually
-
Для кожного з наступних ярликів
OnCalendar
вкажіть відповідну специфікацію часу (довша нормалізована форма):hourly
daily
weekly
monthly
yearly
-
Поясніть значення наступних специфікацій часу, знайдених у файлі
crontab
:30 13 * * 1-5
00 09-18 * * *
30 08 1 1 *
0,20,40 11 * * Sun
00 09 10-20 1-3 *
*/20 * * * *
-
Поясніть значення наступних специфікацій часу, які використовуються в параметрі
OnCalendar
файлу таймера:*-*-* 08:30:00
Sat,Sun *-*-* 05:00:00
*-*-01 13:15,30,45:00
Fri *-09..12-* 16:20:00
Mon,Tue *-*-1,15 08:30:00
*-*-* *:00/05:00
Дослідницькі вправи
-
Якщо припустити, що ви маєте право планувати завдання за допомогою
cron
як звичайний користувач, яку команду ви використаєте, щоб створити власний файл crontab? -
Створіть просте заплановане завдання, яке виконує команду
date
щоп’ятниці о 13:00. Де можна побачити результати цієї роботи? -
Створіть інше заплановане завдання, яке виконує сценарій
foobar.sh
щохвилини, перенаправляючи вихідні дані у файлoutput.log
у вашому домашньому каталозі, щоб вам електронною поштою надсилалися лише стандартні помилки. -
Подивіться на запис
crontab
щойно створеного запланованого завдання. Чому не потрібно вказувати абсолютний шлях до файлу, у якому зберігається стандартний вивід? І чому ви можете використовувати команду./foobar.sh
для виконання сценарію? -
Відредагуйте попередній запис
crontab
, видаливши переспрямування виводу та вимкнувши перше завдання cron, яке ви створили. -
Як ви можете надіслати результати та помилки вашого запланованого завдання до облікового запису користувача
emma
електронною поштою? І як можна уникнути надсилання стандартного виведення та помилки електронною поштою? -
Виконайте команду ls -l /usr/bin/crontab. Який спеціальний біт встановлений і яке його значення?
Підсумки
На цьому уроці ви дізналися про:
-
Використання
cron
для запуску завдань через регулярні проміжки часу. -
Керування завданнями cron.
-
Налаштування доступу користувача до планування завдань cron.
-
Зрозуміли роль таймерів systemd як альтернативи
cron
.
У цьому уроці обговорювалися такі команди та файли:
crontab
-
Підтримує файли
crontab
для окремих користувачів. /etc/cron.allow
та/etc/cron.deny
-
Окремі файли, які використовуються для встановлення обмежень
crontab
. /etc/crontab
-
Системний файл crontab.
/etc/cron.d
-
Каталог, який містить системні файли crontab.
systemctl
-
Керує системою systemd і диспетчером служб. Стосовно таймерів його можна використовувати для їх увімкнення та запуску.
Відповіді до вправ посібника
-
Для кожного з наступних ярликів
crontab
вкажіть відповідну специфікацію часу (тобто перші п’ять стовпців у файліcrontab
користувача):@hourly
0 * * * *
@daily
0 0 * * *
@weekly
0 0 * * 0
@monthly
0 0 1 * *
@annually
0 0 1 1 *
-
Для кожного з наступних ярликів
OnCalendar
вкажіть відповідну специфікацію часу (довша нормалізована форма):hourly
*-*-* *:00:00
daily
*-*-* 00:00:00
weekly
Mon *-*-* 00:00:00
monthly
*-*-01 00:00:00
yearly
*-01-01 00:00:00
-
Поясніть значення наступних специфікацій часу, знайдених у файлі
crontab
:30 13 * * 1-5
О 13:30 щодня з понеділка по п’ятницю
00 09-18 * * *
Щодня та щогодини з 09:00 до 18:00
30 08 1 1 *
О 08:30 ранку першого січня
0,20,40 11 * * Sun
Щонеділі об 11:00, 11:20 та 11:40
00 09 10-20 1-3 *
О 09:00 з 10 по 20 січня, лютого та березня
*/20 * * * *
Кожні двадцять хвилин
-
Поясніть значення наступних специфікацій часу, які використовуються в параметрі
OnCalendar
файлу таймера:*-*-* 08:30:00
Щодня о 08:30 год
Sat,Sun *-*-* 05:00:00
У суботу та неділю о 05:00 ранку
*-*-01 13:15,30,45:00
О 13:15, 13:30 та 13:45 першого числа місяця
Fri *-09..12-* 16:20:00
О 16:20 кожної п’ятниці у вересні, жовтні, листопаді та грудні
Mon,Tue *-*-1,15 08:30:00
О 08:30 ранку першого або п’ятнадцятого числа кожного місяця, лише якщо день припадає на понеділок або вівторок
*-*-* *:00/05:00
Кожні п’ять хвилин
Відповіді до дослідницьких вправ
-
Якщо припустити, що ви маєте право планувати завдання за допомогою
cron
як звичайний користувач, яку команду ви використаєте, щоб створити власний файл crontab?dave@hostname ~ $ crontab -e no crontab for dave - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ---- easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
-
Створіть просте заплановане завдання, яке виконує команду
date
щоп’ятниці о 13:00. Де можна побачити результати цієї роботи?00 13 * * 5 date
Вихідні дані надсилаються користувачеві; щоб переглянути їх, ви можете скористатися командою
mail
. -
Створіть інше заплановане завдання, яке виконує сценарій
foobar.sh
щохвилини, перенаправляючи вихідні дані у файлoutput.log
у вашому домашньому каталозі, щоб вам електронною поштою надсилалися лише стандартні помилки.*/1 * * * * ./foobar.sh >> output.log
-
Подивіться на запис
crontab
щойно створеного запланованого завдання. Чому не потрібно вказувати абсолютний шлях до файлу, у якому зберігається стандартний вивід? І чому ви можете використовувати команду./foobar.sh
для виконання сценарію?cron
викликає команди з домашнього каталогу користувача, якщо інше розташування не вказано змінною середовищаHOME
у файліcrontab
. З цієї причини ви можете використати відносний шлях вихідного файлу та запустити сценарій за допомогою./foobar.sh
. -
Відредагуйте попередній запис
crontab
, видаливши переспрямування виводу та вимкнувши перше завдання cron, яке ви створили.#00 13 * * 5 date */1 * * * * ./foobar.sh
Щоб вимкнути завдання cron, ви можете просто закоментувати відповідний рядок у файлі
crontab
. -
Як ви можете надіслати результати та помилки вашого запланованого завдання до облікового запису користувача
emma
електронною поштою? І як можна уникнути надсилання стандартного виведення та помилки електронною поштою?Щоб надіслати стандартний вихід і помилку до
emma
, ви повинні встановити змінну середовищаMAILTO
у вашому файліcrontab
таким чином:MAILTO="емма"
Щоб повідомити
cron
, що пошта не повинна надсилатися, ви можете призначити порожнє значення змінній середовищаMAILTO
.MAILTO=""
-
Виконайте команду ls -l /usr/bin/crontab. Який спеціальний біт встановлений і яке його значення?
$ ls -l /usr/bin/crontab -rwxr-sr-x 1 root crontab 25104 feb 10 2015 /usr/bin/crontab
Команда
crontab
має встановлений біт SGID (символs
замість позначки виконуваного файлу для групи), що означає, що вона виконується з привілеями групи (отже,crontab
). Ось чому звичайні користувачі можуть редагувати свій файлcrontab
за допомогою командиcrontab
. Зауважте, що багато дистрибутивів мають права доступу до файлів, налаштовані таким чином, що файлиcrontab
можна редагувати лише за допомогою командиcrontab
.