Утилита cron работает в фоновом режиме и постоянно проверяет файл /etc/crontab. Утилита cron проверяет также каталог /var/cron/tabs в поиске новых файлов crontab. Файлы в каталоге /var/cron/tabs называются по имени пользователя, которому они принадлежат, таким образом каждый пользователь может назначать задания независимо от других. Файлы crontab содержат информацию об определенных функциях, которые cron выполняет в указанное время.
Утилита cron использует два разных типа конфигурационных файлов, системный и пользовательский. Все различие между этими двумя форматами заключается в шестом поле. В системном файле шестое поля это имя пользователя, с правами которого будет запущена команда. Это позволяет запускать команды из системного crontab от любого пользователя. В пользовательском файле шестое поле указывает запускаемую команду, и все команды запускаются от пользователя, который создал crontab; это важно для безопасности.
Замечание: пользовательские crontab позволяют индивидуальным пользователям планировать задачи без привилегий суперпользователя (root). Команды из crontab пользователя запускаются с привилегиями этого пользователя.
Пользователь root может использовать собственный crontab, как и любой другой пользователь. Он будет отличаться от системного crontab /etc/crontab. Поскольку существует системный crontab, обычно не требуется создавать пользовательский crontab для root.
Давайте заглянем в файл /etc/crontab (системный crontab):
# /etc/crontab - root's crontab for FreeBSD#
# $FreeBSD: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp $
#
#
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
#
#minute hour mday month wday who command
*/5 * * * * root /usr/libexec/atrun
-
- Как и в большинстве файлов настройки FreeBSD, символы ``#'' означают комментарии. Комментарии нужны для напоминания о том, что означает строка и зачем она добавлена. Комментарии не могут находиться на той же строке, что и команда, или они будут восприняты как часть команды; располагайте их на новой строке. Пустые строки игнорируются.
-
- Сначала должны быть заданы переменные окружения. Знак равно (=) используется для задания переменных окружения, в этом примере SHELL, PATH, и HOME. Если переменная для оболочки не задана, cron использует оболочку по умолчанию, sh. Если не задана переменная PATH, значение по умолчанию не устанавливается и пути к файлам должны быть полными. Если не задана переменная HOME, cron будет использовать домашний каталог соответствующего пользователя.
-
- В строке всего семь полей. Их значения minute, hour, mday, month, wday, who (кто), и command. Значение полей почти очевидно. minute это время в минутах, когда будет запущена команда. hour означает то же самое для часов. mday означает день месяца. month, это то же самое, что час и минута, но для месяцев. Параметр wday это день недели. Все эти поля должны быть в числовом формате, время в двадцатичетырехчасовом исчислении. Поле who имеет специальное значение, и присутствует только в файле /etc/crontab. Это поле определяет пользователя, с правами которого должна быть запущена команда. Когда пользователь устанавливает собственный файл crontab, он не указывает этот параметр. Последний параметр command. Он указывает команду, которая должна быть запущена.
-
- Последняя строка определяет параметры, описанные выше. Здесь задано значение */5, и несколько символов *. Эти символы * означают ``первый-последний'', и могут быть интерпретированы как каждый. Слеш перед цифрой 5 означает пропуск величиной в 5. Таким образом, для этой строки соответствующая команда atrun вызывается под пользователем root каждые пять минут (0, 5, 10, 15 минут и т. д.) независимо от дня или месяца. За дополнительной информацией по команде atrun обращайтесь к странице справочника atrun(8).
Команды могут принимать любое количество параметров; однако команды, состоящие из нескольких строк, должны быть объединены символом ``\''.
Этот формат одинаков для каждого файла crontab, за исключением одной детали. Шестое поле, где указано имя пользователя, присутствует только в файле /etc/crontab. Это поле должно быть исключено из crontab файлов пользователей.
Важно: файл /etc/crontab (как и пользовательские файлы crontab) обязательно в конце файла должны иметь символ возврата каретки (перевода строки) - иначе последнее задание не будет выполняться, и Вы долго будете разбираться, почему.
Установка crontab
Важно: Вы не должны использовать процедуру, описанную здесь, для установки системного crontab. Просто используйте свой любимый текстовый редактор: утилита cron узнает о том, что файл изменился и сразу начнет использовать обновленную версию.
Для установки готового crontab пользователя, сначала создайте в вашем любимом редакторе файл соответствующего формата, а затем воспользуйтесь утилитой crontab. Обычно она запускается так:
% crontab crontab-file
В этом примере, crontab-file это имя файла crontab, который только что был создан.
Существует также параметр для просмотра установленных файлов crontab: задайте crontab параметр -l.
Для пользователей, составляющих crontab вручную, без временного файла, существует параметр crontab -e. Она вызовет редактор с пустым файлом. Когда файл будет сохранен, crontab автоматически установит его.
Если позднее вы захотите полностью удалить свой crontab, используйте crontab с параметром -r.
Важно: вызов crontab без параметров удалит все назначенные задания.
Информацию предоставил Tom Rhodes. Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
Примеры
Запуск perl-скрипта каждую минуту (удобно использовать для отладки)
*/1 * * * * root perl /script_folder/mailbox-clean.pl mail.mydomain.ru
Запуск perl-скрипта каждую ночь в 01:15
15 1 * * * root perl /script_folder/mailbox-clean.pl mail.mydomain.ru
Возможные проблемы с crontab
После редактирования файла crontab получают сообщения вида "root: not found''. Обычно это случается при редактировании системного crontab-файла (/etc/crontab) и последующего использования утилиты crontab(1) для его установки:
# crontab /etc/crontab
Это неправильно. Системный crontab-файл имеет формат, отличный от пользовательских crontab-файлов, которые обновляет утилита crontab(1) (страница Справочника по crontab(5) описывает отличия более подробно).
Если вы сделали именно это, то нужно удалить файл /var/cron/tabs/root, так как он будет являться просто копией /etc/crontab, но неправильного формата. В следующий раз при редактировании /etc/crontab вам не нужно ничего делать для извещения утилиты cron(8) о сделанных изменениях, так как она заметит изменения автоматически.
Реальная причина ошибки заключается в том, что системный crontab-файл имеет
дополнительное поле, указывающее, какой пользователь запускает команду. В системном crontab-файле, поставляемом с FreeBSD и используемом по умолчанию, это пользователь root для всех строк. Если этот crontab-файл используется в качестве crontab-файла пользователя root (что не то же самое, что системный crontab-файл), cron(8) полагает, что слово root является первым в команде на выполнение, но такой команды не существует.
Информация взята с сайта progiblog.ru.
|