Налаштування планувальника cron у Linux


Дуже часто доводиться періодично виконувати ті самі дії: моніторинг доступності сайту, оновлення цін (якщо у вас Інтернет-магазин), переіндексація, застосування цінових правил, резервне копіювання бази даних, ротація журналів тощо. Для автоматизації подібних завдань у Linux використовується планувальник завдань cron.

Таблиця розкладу демона cron, тобто вказівки, коли та яку команду потрібно виконати, зберігається у файлі /etc/crontab.

Розглянемо приклад цього файлу:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root nice -n 19 run-parts --report /etc/cron.hourly
02 4 * * * root nice -n 19 run-parts --report /etc/cron.daily
22 4 * * 0 root nice -n 19 run-parts --report /etc/cron.weekly
42 4 1 * * root nice -n 19 run-parts --report /etc/cron.monthly

Параметр SHELL задає ім'я програми-оболонки, параметр PATH - шлях пошуку програм, MAILTO - ім'я користувача, якому буде надіслано звіт про виконання розкладу, а HOME - домашній каталог crond. Але найголовніше — не ці параметри, а сама таблиця розкладів, що займає в нашому випадку останні чотири рядки лістингу. Відповідно до цієї таблиці щогодини виконуватимуться програми з каталогу /etc/cron.hourly, щодня — з каталогу /etc/cron.daily, щотижня — з каталогу /etc/cron.weekly, а раз на місяць — з каталогу /etc /cron.monthly.

Припустимо, вам потрібно щодня виконувати команду update_av ftp://server.com/bases/. У каталозі /etc/cron.daily створіть файл update_av такого змісту:

#!/bin/bash
update_av ftp://server.com/bases/
Цей файл являє собою невеликий bash-сценарій (сценарій командного інтерпретатора). Тепер зробимо його здійсненним:
# chmod +x update_av

Справді, зручно? Але іноді нам буває потрібно створити більш гнучке розклад. Наприклад, ми хочемо, щоб одна програма виконувалася о 7:00, а інша о 7:20. Тут простим додаванням сценарію в каталог /etc/cron.daily вже не відбудешся. Щоб створити такий розклад, вам доведеться вивчити формат записів таблиці розкладів:

хвилини (0?59) години (0?23) день (1?31) місяць (1?12) день_тижня (0?6, 0 — Нд) команда

Щоб реалізувати наш розклад, слід додати до файлу /etc/crontab наступні рядки:

0 7 * * * /usr/bin/command1 arguments
20 7 * * * /usr/bin/command2 arguments

Перша команда запускатиметься щодня о 7 годині ранку, а друга — теж щодня, але о 7:20.

Знавши формат crontab, ми можемо відредагувати стандартну таблицю розкладів. Зверніть увагу - команди, що виконуються щодня, запускатимуться о 4 годині ранку. Це звичайно зручно, але вони не будуть виконані, якщо ви вимикаєте віртуальний сервер на ніч для економії коштів. Тому давайте встановимо інший час, наприклад 9:02 ранку:

02 9 * * * root nice -n 19 run-parts --report /etc/cron.daily

Аналогічна ситуація з щотижневим запуском. Програми будуть запущені не лише о 4:22 ранку, а ще й у неділю. Якщо сервер вимикається на вихідні (якщо це не веб-сервер, тобто він не повинен працювати 24/7, є сенс вимикати його на вихідні). Тому доцільно призначити запуск на понеділок о 8 годині 22 хвилині:

22 8 * * 1 root nice -n 19 run-parts --report /etc/cron.weekly

Крім основного конфігураційного файлу користувачі Linux можуть створювати власні розклади. Редагування власного розкладу здійснюється командою crontab –e. Якщо ім'я користувача не вказано, буде відредаговано розклад поточного користувача:

crontab -e

Користувач root може редагувати розклад будь-якого користувача в системі. Для цього йому потрібно вказати ім'я користувача за допомогою параметра –u:

crontab –e –u hosting