Лекция №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.

Читать другие лекции по курсу Администратор ПК с Linux

Статьи и новости схожей тематики:

Комментариев: 5

  1. Аноним:

    Будет ли продолжение уроков, приблизительно сколько?

    Ответить

    Igorka Reply:

    Продолжение будет. Примерно 5-6 лекций еще будет.

    Ответить

  2. lexore:

    В папке /etc/cron.d/ на имена файлов накладываются некоторые ограничения.
    В частности - не должно быть точки.
    Шаблон: [a-zA-Z0-9_-]+
    Момент не явный, упоминается под конец man cron.

    Ответить

    Igorka Reply:

    Спасибо за дополнение!

    Ответить

  3. 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 * * * *”.

    Ответить

Оставьте свой отзыв