Cron — это программа, которая используется в unix-системах для выполнения заданий в определенное время. Задания могут запускаться как единоразово, так и переодически.
Служба пранирования заданий состоит из демона, который обычно называется crond и набора конфигурационных файлов – для каждого из пользователей в /var/spool/cron, общесистемного /etc/crontab и /etc/cron.d.
При загрузке системы, запускается демон cron и проверяет очередь заданий at и заданий пользователей в файлах crontab. При запуске, демон cron сначала проверяет каталог /var/spool/cron на наличие файлов crontab, которые имеют имена пользователей, соответствующие именам пользователей из /etc/passwd, также он проверяет /etc/crontab и наличие файлов в директории /etc/cron.d/. Найденные файлы загружаются в память, далее крон проверяет ежеминутно нужно ли запускать какое либо из заданий в данную минуту, кроме этого проверяется происходило ли обновления директории spool, cron.d или файла /etc/crontab.В случае обновлений, измененные файлы заново перечитываются. Таким образом, при обновлении файла крона нет необходимости производить его перезагрузку, все файлы будут считаны автоматически при последующей проверке.
Стандартный файл /etc/crontab выглядит так:
cat
/etc/crontab
SHELL=
/bin/bash
PATH=
/sbin
:
/bin
:
/usr/sbin
:
/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts
/etc/cron
.hourly
02 4 * * * root run-parts
/etc/cron
.daily
22 4 * * 0 root run-parts
/etc/cron
.weekly
42 4 1 * * root run-parts
/etc/cron
.monthly
Первые четыре строки — это переменные, настраивающие среду окружения, в котором будут работать задачи cron. Значение переменной SHELL сообщает системе о том, какую оболочку использовать (в этом примере будет использована оболочка bash, если переменная не указана, то значение будет взято из /etc/passwd для пользователя являющимся владельцем файла), а переменная PATH определяет пути, используемые для выполнения команд. Результат выполнения задач cron будет выслан по электронной почте пользователю, определённому в переменной MAILTO. Если в качестве значения переменной MAILTO задана пустая строка (MAILTO=»»), электронные письма отправляться не будут. Переменная HOME задаёт домашний каталог, используемый при выполнения команд или сценариев.
Каждая строка в файле /etc/crontab имеет следующий формат:
minute hour day month dayofweek command
minute — любое целое число от 0 до 59
hour — любое целое от 0 до 23
day — любое целое от 1 до 31 (день должен быть корректным, если указан месяц)
month — любое целое от 1 до 12 (или короткое название месяца, например: jan, feb и так далее)
dayofweek — любое целое от 0 до 7, где 0 или 7 означает Воскресенье (или короткое название дня недели, например: sun, mon и так далее)
command — команда, которая должны быть выполнена. Командой может быть как простая команда, например, ls /proc >> /tmp/proc, или команда запуска написанного вами специального сценария.
Для любых указанных выше параметров можно использовать звездочку (*), что означает все допустимые значения. Например, если поставить звёздочку в значении месяца, команда будет выполняться каждый месяц во время, указанное другими параметрами.
Дефис (-) между целыми числами обозначает диапазон чисел. Например, 1-4 означает целые числа 1, 2, 3 и 4.
Список значений, разделенных запятыми (,), обозначает перечень. Например, перечисление 3, 4, 6, 8 означает четыре указанных целых числа.
Косая черта (/) используется для определения шага значений. Целочисленное значение может быть пропущено в диапазоне, если после диапазона указать /<целое>. Например, значение минут 0-59/2, определяет, что будет пропущена каждая вторая минута. В качестве шага значений также может быть указана звёздочка. Например, значение месяца */3 определяет, что будет пропущен каждый третий месяц.
Таким образом в файле /etc/crontab определен запуск сценариев из директорий /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly и /etc/cron.monthly соответственно ежечасно, ежедневно, еженедельно и ежемесячно. Содержимое из этих каталогов будет запускаться с правами доступа пользователя root и файлы должны иметь права доступа на «выполнение».
Если задачи cron должны выполняться по расписанию, но не ежечасно, ежедневно, еженедельно или ежемесячно, их можно добавить в каталог /etc/cron.d. Все файлы в этом каталоге имеют тот же синтаксис, что и /etc/crontab.
Другие пользователи также могут настраивать свои задачи cron с помощью программы crontab. Для этого необходимо запустить команду crontab -e (будет вызван текстовый редактор, указанный в значении переменной окружения VISUAL или EDITOR) и отредактирвоать файл (формат тот же что и у /etc/crontab). После сохранения изменений файл будет записан в соответствии с именем пользователя в директории /var/spool/cron/username.
Другие полезные опции команды crontab:
-e — запустить текстовый редактор crontab;
-l — вывести содержимое файла crontab для пользователя на экран;
-r — удаление текущего файла crontab;
-u user — где user это пользователь от имени которого будет производиться запуск crontab (таким образом root может редактировать задания пользователей)
Все команды, которые запускает крон можна посмотреть в логах в /var/log/cron, а также файлах cron1, cron2 и т.д. (в них находятся более старые данные).
Пример использования cron:
crontab
-l
# каждые 5мин синхронизироваться с сервером времени и не отправлять
#уведомление об этом, т.е. stdout и stderr направить в /dev/null
*
/5
* * * * root
/usr/sbin/ntpdate
time
.ukr.net >
/dev/null
2>&1
# на 1-ой и 31-ой минуте с 0 до 5 запусать скрипт в ~/script.py
1,31 0-5 * * *
/home/user/script
.py
# каждый рабочий день в 13:00
0 13 * * 1-5
/home/user/script
.py
# выполнять 1 числа каждого месяца в 15 часов
0 15 1 * *
/home/user/script
.py
# Каждые два часа в 25 минут (тоесть в 0:25, 2:25, 4:25 и т.д.)
#запускать команду top и дописывать ее вывод в файл
25 *
/2
* * *
/usr/bin/top
-b -n 1 >>
/home/user/top_stats
.txt
* * * * * /usr/bin/php /var/www/data/www/cron.php
/usr/bin/php - интерпретатора php
/var/www/data/www/cron.php - php скрипт
$path_parts = pathinfo($_SERVER['SCRIPT_FILENAME']); // определяем директорию скрипта chdir($path_parts['dirname']); // задаем директорию выполнение скрипта