Лекция №26 - демон cron и команда crontab
Демон cron (произносится “крон”) - это фоновый процесс который позволяет запускать на исполнение файлы в назначенное время. Если необходимо, чтобы с заданной периодичностью в системе запускался скрипт или программа, то это задача для cron. Сегодня мы рассмотрим как настраивать демон cron вручную, а также при помощи команды crontab.
Демон cron может запускать задачу не только для системы в целом, но и для отдельного пользователя. Файлы, которые описывают, что и когда будет запускаться для отдельного пользователя находятся в каталоге /var/spool/cron/crontabs/. Доступ к этому каталогу есть только у пользователя root.
Внутри каталога /var/spool/cron/crontabs/ для каждого пользователя создается текстовый файл по имени (логину) пользователя в котором и хранятся настройки. Например, если в системе есть пользователь test и он настраивал для себя cron, то будет создан файл с настройками - /var/spool/cron/crontabs/test. Пользователь test прямого доступа к этому файлу не имеет. Как создается этот файл и редактируется мы поговорим позже (для этого используется команда crontab).
Для того, чтобы проверить запущен ли процесс cron выполните команду:
1 2 | igor@adm-ubuntu:~$ ps ax | grep [c]ron 1026 ? Ss 0:00 cron |
Если демон не запущен запустить его можно как и любой другой демон командой /etc/init.d/cron start, выполненной от имени администратора.
Демон cron работает в поминутном режиме. То есть задать время выполнения того или иного задания можно с точностью до одной минуты. Основной конфигурационный файл демона cron - это /etc/crontab. Основная часть файла -это таблица в 7 столбцов, каждая строка, которой описывает одно задание. Файлы которые описывают задания для демона cron, также часто называют crontab-файлами.
Пример файла /etc/crontab:
1 2 3 4 5 | # m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) |
Каждой строке задаются значения 7-ми полей:
m - minute - минута - на какой минуте выполнять задание; диапазон значений - (0-59)
h - hour - час - в котором часу выполнять задание; диапазон значений (0-23)
dom - day of month - день месяца - в какие дни месяца выполнять задание; диапазон значений (1-31)
mon - month - месяц - в какие месяцы года выполнять задание; диапазон значений (1-12)
dow - day of week - день недели - в какие дни недели выполнять задание; диапазон значений (0-7, 0 и 7 - это воскресенье, дальше по порядку)
user - имя пользователь - пользователь от имени которого будет выполнено задание
command - исполняемая команда - команда, которая будет запущена на выполнение в указанное время.
В первых пяти полях можно указывать не только число из диапазона, но и диапазон чисел, перечисление чисел, диапазон с шагом. Символ * - означает любое значение. Подробно почитать о значениях можно в man 5 crontab. Мы же рассмотрим несколько примеров.
10 6 * * * root myscript - запускать команду myscript каждый день, в 6 часов 10 минут утра.
0 5 1 * * root myscript - запускать команду myscript первого числа каждого месяца в 5 часов утра.
30 23 * * 1-5 root myscript - запускать команду myscript в рабочие дни (кроме субботы и воскресенья) в 23 часа 30 минут.
0 23 1,3,7,15 1,7 * root myscript - запустить команду myscript 1,3,7,15-го числа, месяца января и июля в 23 часа.
30 0-23/3 * * * root myscript - запускать команду каждые три часа. То есть первый запуск будет в 0:30, затем в 3:30 и т.д.
*/5 * * * * root myscript - запускать команду каждые 5 минут (*/5 - без пробелов).
Будьте внимательны с полями 3 и 5 - день месяца и день недели. Если числа есть в обеих полях, например, * 6 5 * 1 root myscript, то запись означает запускать задание в шесть часов 5-го числа каждого месяца или каждый понедельник, но не каждый понедельник 5-го числа.
crontab-файлы также могут содержаться в каталоге /etc/cron.d/, который просматривается демоном cron в процессе работы. Они могут иметь произвольные имена, но структура должна быть такая же как и у файла /etc/crontab. Обычно в этом каталоге хранятся задания различных служб и программ (файлы тогда называются по именам служб или программ).
Обычные пользователи также могут создавать свои crontab-файлы и редактировать их, если обратное не запрещено администратором. Для редактирования crontab-файлов предназначена команда crontab. Зарегистрируйтесь в системе под учетной записью обычного пользователя (например test) и наберите команду crontab -e. Вы попадете в редактор (текстовый редактор по умолчанию в вашей системе) в котором нужно будет набрать задание. Обратите внимание, что в пользовательский crontab-файлах отсутствует поле user, так как оно вычисляется демоном cron из названия самого файла, который будет после редактирования сохранен в каталоге /var/spool/cron/crontabs/ под именем test. Наберите в нем строку с заданием, например:
29 12 * * * touch testfile
В первом втором поле укажите актуальное для вас время (на несколько минут больше текущего) и сохраните файл. Затем проверьте после назначенного времени, корневую директорию пользователя test и убедитесь, что файл был создан:
1 2 | test@adm-ubuntu:~$ ls -l [0-9]* -rw-r--r-- 1 test test 0 2010-01-11 12:16 testfile |
Как видите файл testfile был создан. Также из под учетной записи администратора можете проверить, что был создан и файл /var/spool/cron/crontabs/test:
1 2 | igor@adm-ubuntu:/etc/cron.d$ sudo ls -l /var/spool/cron/crontabs/ -rw------- 1 test crontab 266 2010-01-11 12:13 test |
Если необходимо запретить пользователю создавать и редактировать crontab-файлы сделать это можно записав, имя его учетной записи в файл /etc/cron.deny. Если файла нет, то его нужно создать самому. Имена учетных записей записываются по одному в строке. Можно также использовать файл /etc/cron.allow. Подробнее описано в man crontab.
Аноним:
Будет ли продолжение уроков, приблизительно сколько?
Ответить
Igorka Reply:
февраля 2, 2010 at 18:48
Продолжение будет. Примерно 5-6 лекций еще будет.
Ответить
lexore:
В папке /etc/cron.d/ на имена файлов накладываются некоторые ограничения.
В частности - не должно быть точки.
Шаблон: [a-zA-Z0-9_-]+
Момент не явный, упоминается под конец man cron.
Ответить
Igorka Reply:
февраля 5, 2011 at 16:12
Спасибо за дополнение!
Ответить
Igorka:
@reboot Run once, at startup.
@yearly Run once a year, “0 0 1 1 *”.
@annually (same as @yearly)
@monthly Run once a month, “0 0 1 * *”.
@weekly Run once a week, “0 0 * * 0″.
@daily Run once a day, “0 0 * * *”.
@midnight (same as @daily)
@hourly Run once an hour, “0 * * * *”.
Ответить
20 мая 2011, 17:42