Cron
cron — классический демон (компьютерная программа в системах класса UNIX), использующийся для периодического выполнения заданий в определённое время. Регулярные действия описываются инструкциями, помещенными в файлы crontab и в специальные каталоги.
Название cron образовано от греческого слова χρόνος (хрόнос) — время (по-английски — chronos). Разработчик cron, Кен Томпсон (англ. Ken Thompson), подтвердил это в частной беседе с Брайаном Керниганом (англ. Brian Kernighan)[источник не указан 1798 дней].
В системах на базе systemd cron фактически замещён встроенным механизмом systemd.timer.
Файлы 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 -l
Удаление текущего файла расписания:
crontab -r
Для редактирования файла 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=[email protected] # добавить в 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"
Например, следующий код очищает журнал ошибок Apache в одну минуту после полуночи (00:01) каждый день, предполагая, что оболочка по умолчанию для пользователя cron совместима с оболочкой Bourne:
1 0 * * * printf "" > /var/log/apache/error_log
В этом примере программа оболочки с именем export_dump.sh выполняется каждую субботу в 23:45:
45 23 * * 6 /home/oracle/scripts/export_dump.sh
Примечание. В некоторых системах также можно указать */n для запуска через каждый n-й интервал времени. Кроме того, указание нескольких конкретных временных интервалов может быть выполнено с помощью запятых (например, 1,2,3).
Строка ниже будет выводить «hello world» в командную строку каждую 5-ю минуту каждого первого, второго и третьего часа (то есть 01:00, 01:05, 01:10, вплоть до 03:55).
*/5 1,2,3 * * * echo hello world
Особенности
- Все условия (времени запуска) проверяются по «логическому И», кроме условий «день недели» и «день месяца» — указанные совместно, они обрабатываются по «логическому ИЛИ», то есть «по любому из дней», что отражено в документации (Ubuntu, Debian, FreeBSD). Однако такая логика неочевидна и не позволяет создать условие типа «первый понедельник каждого месяца» или «каждую пятницу в 13 число». Разработчики не изменяют данное поведение, считая его стандартом.[3]
- Все файлы crontab должны завершаться пустой строкой, иначе будет проигнорировано последнее правило либо весь файл.
- Команды файла crontab используют стандартный синтаксис командной оболочки, но их нельзя разделить на несколько строк.
- Запускаемые файлы в автоматически сканируемых каталогах, таких как /etc/cron.daily/, игнорируются, если их имя содержит точку.
- Синтаксис crontab, используемый для запуска раз в несколько минут со сдвигом, может привести к неожиданным результатам. Так, запись
1-56/5 * * * *
не будет совершать запуск по 1-й минуте каждого часа; для срабатывания «каждые 5 минут начиная с 1-й минуты часа» следует использовать формат1-59/5 * * * *
или1,6,11,16,21,26,31,36,41,46,51,56 * * * *
. - Символ
%
в команде запуска используется для передачи перевода строки в команду (если не экранирован). Следующий за ним текст команды передаётся запускаемой программе не как параметры командной строки, а через стандартный ввод. - Вывод запускаемых команд отправляется пользователю, от имени которого производился запуск. Если в файле crontab до команды расположена директива
MAILTO=<new@email>
, то выводимые данные будут отправляться на указанный адрес.
Графический интерфейс
Для удобства пользователей во многих системах есть специальные программы графического интерфейса управления cron.
Gnome Schedule
Для основанных на Debian дистрибутивов:
- Установка:
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).
Примечания
- ↑ Man cron Архивная копия от 28 мая 2007 на Wayback Machine.
- ↑ Cron Howto Архивная копия от 15 мая 2011 на Wayback Machine.
- ↑ Обсуждение в баг-трекере Debian Архивная копия от 11 апреля 2018 на Wayback Machine.
Ссылки
- Man: cron — руководство по cron
- Man: crontab(5) — руководство по командам crontab
- Планирование задач с помощью cron и at
- Небольшой FAQ по cron
- Использование CRON и команды crontab
- Шпаргалка по CRON
- Как запускать PHP-скрипты по расписанию, используя CRON