cron

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

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

Файлы crontab, создаваемые для отдельных пользователей, находятся в каталоге[1] /usr/spool/cron/crontabs/ или /var/spool/cron/tabs/. Редактировать их вручную не рекомендуется, для этого используют команду crontab -e. Файлы crontab, используемые для управления всей системой, располагаются в директории /etc/cron.d/. Кроме того, в директориях /etc/cron.daily/, /etc/cron.weekly/ и /etc/cron.monthly/ размещаются автоматически запускаемые программы (ежедневно, еженедельно или ежемесячно).

Основной файл конфигурации cron, /etc/crontab, выглядит примерно так:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
 
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 
# 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 )
#

crontab[править | править вики-текст]

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

Для редактирования файла crontab вашего пользователя используется команда[2]:

crontab -e

Таблица crontab состоит из 6 колонок, разделяемых пробелами или табуляторами. Первые пять колонок задают время выполнения (Минута, Час, День, Месяц, День недели), в них может находиться число, список чисел, разделённых запятыми, диапазон чисел, разделённых дефисом, символы '*' или '/'. В системных файлах crontab после полей времени указывается пользователь, от которого запускается команда. Все остальные символы в строке интерпретируются как выполняемая команда с её параметрами. Если команда отправляет какой-нибудь текст в стандартный вывод, этот текст отправляется по e-mail пользователю.

* * * * * выполняемая команда
- - - - -
| | | | |
| | | | ----- День недели (0 - 7) (Воскресенье =0 или =7)
| | | ------- Месяц (1 - 12)
| | --------- День (1 - 31)
| ----------- Час (0 - 23)
------------- Минута (0 - 59)

Пример файла crontab:

 # как обычно, с символа '#' начинаются комментарии
 # в качестве командного интерпретатора использовать /bin/sh
 SHELL=/bin/sh
 # результаты работы отправлять по этому адресу
 MAILTO=paul@example.org
 # добавить в PATH домашний каталог пользователя
 PATH=/bin:/usr/bin:/home/paul/bin
 
 #### Здесь начинаются задания
 # выполнять каждый день в 0 часов 5 минут, результат складывать в log/daily
 5 0 * * * $HOME/bin/daily.job >> $HOME/log/daily 2>&1
 # выполнять 1 числа каждого месяца в 14 часов 15 минут
 15 14 1 * * $HOME/bin/monthly
 # каждый рабочий день в 22:00
 0 22 * * 1-5 echo "Пора домой" | mail -s "Уже 22:00" john
 
 23 */2 * * * echo "Выполняется в 0:23, 2:23, 4:23 и т. д."
 5 4 * * sun echo "Выполняется в 4:05 в воскресенье"
 0 0 1 1 * echo "С новым годом!"
 15 10,13 * * 1,4 echo "Эта надпись выводится в понедельник и четверг в 10:15 и 13:15"
 0-59 * * * * echo "Выполняется ежеминутно"
 0-59/2 * * * * echo "Выполняется по четным минутам"
 1-59/2 * * * * echo "Выполняется по нечетным минутам"
 # каждые 5 минут
 */5 * * * * echo "Прошло пять минут"
 # каждое первое воскресенье каждого месяца. -eq 7 это код дня недели, т.е. 1 -> понедельник , 2 -> вторник и т.д.
 0 1 1-7 * * [ "$(date '+\%u')" -eq 7 ] && echo "Эта надпись выводится каждое первое воскресенье каждого месяца в 1:00"

Пример Сrontab в Ubuntu 9.10

Редактируем от пользователя user

sudo crontab -e -u user

где user -пользователь от имени которого будет производиться запуск.

# m h  dom mon dow   command
# Запускаю eMule ночью  в 1 час ночи 10 минут
10 1  * * *  export DISPLAY=:0 && amule
# Останавливаю eMule утром в 10 часов 10 минут
10 10 * * *  export DISPLAY=:0 && killall amule

'#' — является комментарием.

export DISPLAY=:0 && -Выводим на дисплей (если есть что выводить)

часто этого недостаточно для запуска графических приложений; для возможности локально подключаться к X-серверу необходимо добавить

 xhost +local: 

в файл .profile находящийся в домашнем каталоге пользователя.

Особенности[править | править вики-текст]

  • Все условия (времени запуска) проверяются по "логическому И", кроме условий "день недели" и "день месяца" — указанные совместно, они обрабатываются по "логическому ИЛИ", то есть "по любому из дней", что отражено в man-странице (Ubuntu, Debian, FreeBSD). Однако, такая логика неочевидна и не позволяет создать условие типа "первый понедельник каждого месяца" или "каждую пятницу в 13 число". Разработчики не изменяют данное поведение, считая его стандартом.[3]
  • Все файлы crontab должны завершаться пустой строкой, иначе будет проигнорировано последнее правило либо весь файл.
  • Команды файла crontab используют стандартный shell-синтаксис, но их нельзя разделить на несколько строк.
  • Запускаемые файлы в автоматически сканируемых директориях, таких как /etc/cron.daily/, игнорируются, если их имя содержит точку.
  • Синтаксис crontab, используемый для запуска раз в несколько минут со сдвигом, может привести к неожиданным результатам. Так, запись 1-56/5 * * * * не будет совершать запуск по 01-й минуте каждого часа; для срабатывания "каждые 5 минут начиная с 1-й минуты часа" следует использовать формат 1-59/5 * * * * или 1,6,11,16,21,26,31,36,41,46,51,56 * * * *.
  • Символ '%' в команде запуска используется для передачи перевода строки в команду (если не экранирован). Следующий за ним текст команды передаются запускаемой программе не как параметры командной строки, а как входные данные ("standart input").
  • Вывод запускаемых команд отправляется пользователю, от имени которого производился запуск. Если в файле crontab до команды расположена директива MAILTO=<new@email>, то выводимые данные будут отправляться на указанный email.

Графический интерфейс[править | править вики-текст]

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

Gnome Schedule[править | править вики-текст]

Для Debian-based дистрибутивов:

  • Установка: sudo apt-get install gnome-schedule
  • Запуск: Applications → System tools → Schedule [1]

Kcron[править | править вики-текст]

Kcron представляет собой KDE-интерфейс для редактирования конфигурационных файлов cron. Утилита запускается по Alt+F2, в окне редактирования можно указать мышью:

  • полный путь к выполняемому файлу программы
  • нужное время запуска программы
  • переменные окружения, необходимые во время исполнения программы

Подробнее см. руководство пользователя (рус.)

Сходные программы[править | править вики-текст]

  • NnCron — наиболее продвинутый планировщик для Windows
  • Task_Scheduler — планировщик задач Windows и ее консольная утилита schtasks.exe
  • at — однократный запуск программ в заданное время.
  • anacron — периодический запуск программ, не обязательно в точности в заданное время: например если в указанное в задании время машина была выключена anacron выполнит задание позже
  • inetd — запуск программ обслуживания сетевых запросов
  • upstart — запуск программ обслуживания событий (обобщение cron, atd, anacron, inetd)

Примечания[править | править вики-текст]

Ссылки[править | править вики-текст]