Crontab - формат записи событий

Cron это программа, выполняющая задания по расписаню. Позволяет неоднократный запуск заданий. Т.е. задание можно запустить в определенное время или через определенный промежуток времени.

При загрузке системы, запускается демон cron и проверяет очередь заданий at и заданий пользователей в файлах crontab. При запуске, демон cron сначала проверяет каталог /var/spool/cron на наличие файлов crontab, файлы crontab имеют имена пользователей, соответствующие именам пользователей из /etc/passwd Каждый пользователь может иметь только один файл crontab, записей в файле может быть несколько.

Файлы crontab содержат инструкции для демона cron, который запустит задание(я) описанное в файле crontab. Все файлы crontab из каталога /var/spool/cron загружаются в память, одновременно с ними загружаются файлы из /etc/cron.d После этого демон cron загружает содержимое файла /etc/crontab.

После того, как демон cron запущен и прочел содержимое всех файлов crontab, он бездействует, просыпаясь каждую минуту и проверяя не требуется ли запуск какой-либо команды в данную минуту, или не появился ли новый файл crontab который необходимо обработать. Демон cron определяет изменения по времени модификации файлов или каталогов, такое его свойство избавляет от необходимости перезапуска демона.

Чтобы получить пользователю доступ к управлению заданиями cron, ему необходимо воспользоваться командой:

crontab -e

посмотреть юзером "user" есть ли у него файл crontab ,достаточно набрать команду:

crontab -l

если файл существует-будет показано его содержимое.

Для удаления файла используется команда:

crontab -r

Для управления файлами crontab пользователем "root" используется синтаксис:

crontab -u user_name file

Данная команда создаст файл crontab из файла "file" для пользователя "user_name". Ключ -u означает, чей crontab будет обработан. Если опция не задана, то будет обработан crontab того пользователя, который запустил команду crontab.

Просмотре, удаление и редактирование файла crontab для определенного пользователя из под root, выглядит так:

	crontab -u user_name -l
	crontab -u user_name -r
	crontab -u user_name -e

Для редактирования файла crontab используется редактор, заданный переменной окружения VISUAL или EDITOR.

Формат и значения полей

Каждая команда в пользовательском файле crontab занимает одну строку и состоит из шести полей. Пользовательские файлы crontab находятся в каталоге /var/spool/cron

Общий формат команды имеет вид:

	минута час день_месяца месяц день_недели команда

Допустимые значения:

минута
от 0 до 59
час
от 0 до 23
день_месца
от 1 до 31
месяц
от 1 до 12 (можно 3 буквы из названия месяца: от jan до dec)
день недели
от 0 до 6 (имейте ввиду, что 0 - это воскресение; можно также писать буквенное значение: от sun до sat)

Каждое из полей даты и времени может быть обозначено символом * ,будет соответствовать любому возможному значению.

Также для этих полей можно указывать диапазоны значений, разделенных дефисом. Например, следующая запись, будет печатать "HELLO" в 5:00 на 4,5,6,7,8,9,10 дни января, февраля, марта и апреля:

* 5 4-10 0-3 * echo "HELLO"

А такая запись, будет печатать фразу каждый четный час, каждую субботу:

* */2 * * sat echo "HELLO"

Данная запись является краткой формой для аналогичной ей:

* 0,2,4,6,8,10,12,14,16,18,20,22 * * 6 echo "HELLO"

Фраза, которая поздравит вас с Новым годом:

59 23 31 dec * echo "Happy new year"

Для отладки постановки заданий, можно настроить отправку результатов в файл:

0-59 * * * * /home/user/mail 2>/tmp/tmp.cron

Если при запуске команды /home/user/mail возникнут ошибки, то они будут записаны в файл /tmp/tmp.cron и вы всегда сможете узнать причину. В случае перенаправления вывода в файл, письмо, юзеру указанному в переменной MAILTO отправлено не будет.

Посмотреть информацию о всех командах запускаемых демоном cron можно в каталоге /var/log называются cron, cron1 и т.д. В файле /var/log/cron записано время запуска всех заданий cron за предыдущий день.

Немного примеров

Планирование задач в течение определённого времени. Следующая запись, позволит выполнять скрипт полного резервного копирования (full-backup) 10 июня в 8.30:

30 08 10 06 * /home/developer/full-backup

Расписание задач для более частого выполнения (например, дважды в день). Следующий скрипт использует дополнительное резервное копирование дважды в день каждый день. В этом примере выполняется дополнительное резервное копирование (incremental-backup) в 11:00 и в 16:00 каждый день. Значения через запятую в поле указывают, что команда должна быть выполнена в каждое указанное время:

00 11,16 * * * /home/developer/bin/incremental-backup

Расписание работы в течение определённого интервала времени (например, только в будние дни). Этот пример каждый день проверяет состояние базы данных (включая выходные) в течение рабочих часов с 9 утра до 6 вечера.

Этот пример проверяет состояние базы данных каждый рабочий день (кроме субботы и воскресенья) с 9 утра до 6 вечера:

00 09-18 * * 1-5 /home/ramesh/bin/check-db-status

Выполнение какой-то команды cron каждую минуту:

* * * * * CMD

* - означает возможную единицу – то есть, каждую минуту каждого часа в течение года. Указание */5 в поле минут означает каждые 5 минут. Указание 0-10/2 в поле минут означает каждые 2 минуты в первых 10 минутах. Таким образом, данная условность может быть использована во всех 4 полях.

Запуск фоновых задач Cron каждые 10 минут:

*/10 * * * * /home/ramesh/check-disk-space

Существуют особые условия, когда вместо 5 полей вы можете использовать @ и далее ключевое слово – такие как перезагрузка, полночь, ежегодно, ежечасно.

@yearly или @annually
Эквивалент записи: 0 0 1 1 *, которая означает выполнение задачи раз в год
@monthly
Эквивалент: 0 0 1 * * - выполнение задачи раз в месяц
@weekly
Эквивалент: 0 0 * * 0 - выполнение задачи раз в неделю
@daily
Эквивалент: 0 0 * * * - выполнение задачи раз в день
@hourly
Эквивалент: 0 * * * * - выполнение задачи каждый час
@midnight
Выполнение задачи в полночь
@reboot
Выполнение задачи при запуске системы

В таком формате, Расписание работы для первой минуты каждого года с использованием @yearly будет иметь вид:

@yearly /home/developer/red-hat/bin/annual-maintenance

Запуск задач каждый день с использованием @daily

@daily /home/developer/arch-linux/bin/cleanup-logs "day started"

Используя ключевое слово @reboot, будет выполняться указанная команда каждый раз после загрузки системы:

@reboot CMD

Перенаправление вывода

Профессионалы отключают вывод результатов выполнения команды в консоль. Для этого используется команда вида:

cron job command > /dev/null 2>&1

Оператор > («больше чем»), как в примере выше, переадресовывает вывод программы. В данном случае, что-то отправляется в /dev/null, а что-то переадресовывается в &1

Существует три стандартных значения ввода и вывода для программ. Ввод получают от клавиатуры (интерактивная, диалоговая программа), или из программы, обрабатывающей вывод другой программы.

Результат программы обычно печатается в стандартной вывод и иногда в файл «STDERR» (ошибка). Все это три дескриптора файла, которые часто называют STDIN, STDOUT и STDERR. Но часто к ним обращаются не по имени, а по номеру: 0 — STDIN, 1 — STDOUT и 2 — STDERR. По умолчанию, если вы не укажете номер, то будет подразумеваться STDOUT

Т.е. запись, указанная выше, означает команду, которая направляет свой стандартный вывод в /dev/null (псевдоустройство, которое может принять произвольный объём данных, не сохраняя их совершенно нигде, следовательно, подавив стандартный вывод). Затем все ошибки (то есть STDERR) перенаправить в стандартный вывод.

Такая маленькая хитрость позволит вам не засорять логи лишними данными.

Также можно лог направить в какой-то специальный файл с разделением по дням, к примеру. Для этого в имя файла нужно добавить текущую дату в нужном формате:

cron job command >> "/home/bitrix/www/logs/cron/prices_$(date +\%Y_\%m_\%d).log" 2>&1

Вот, в принципе, и все.

Еще ответ на один очень частый у новичков вопрос: "Как выполнять задачи каждую секунду?" Ответ на данный вопрос простой: никак! Вы не можете настроить выполнение cron на каждую секунду. Потому что минимальная единица выполнения cron – минута. В обычном сценарии нет необходимости запускать выполнение cron каждую секунду. И если у вас стоит задача запуска скрипта каждую секунду - значит стоит пересмотреть задачу.

Количество показов: 8784
14.12.2018

Возврат к списку

Если вам была полезна статья можете отблагодарить автора:
Ethereum:

0x16Df809287333C49D3A237296C6248A6c08702Bc

Разработка сайта

Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...

Сопровождение сайта

Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение

Работы по сайту

Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.