FreeBSD: назначенные задания (cron, crontab)

Утилита 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.

Обновлено: 12.03.2015