Настройка планировщика 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.ru/bases/. В каталоге /etc/cron.daily создайте файл update_av следующего содержания:

#!/bin/bash
update_av ftp://server.ru/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