cron и crontab в *nix

cron и crontab в *nix


freelanceland
Ищете фрилансера для выполнения задач?

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


Пример запуска php скриптов:
* * * * * /usr/bin/php /var/www/data/www/cron.php

/usr/bin/php - интерпретатора php
/var/www/data/www/cron.php - php скрипт

в php скрипте перед выполнением кода явно указать(переопределить) $_SERVER['DOCUMENT_RROT']
или прописать окружение скрипта
$path_parts = pathinfo($_SERVER['SCRIPT_FILENAME']); // определяем директорию скрипта chdir($path_parts['dirname']); // задаем директорию выполнение скрипта



Популярное

Как закрыть занятый порт в Linux?
Установка PostgreSQL 13 в Debian 11/10/9
phpStorm горячие клавиши

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