Статьи FAQ: Cron

Discussion in 'Статьи' started by banned, 19 Apr 2007.

  1. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    [Что такое Cron?]

    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 При стандартных настройках, содержимое /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


    Информация файла указывает, что:

    * содержимое каталога /etc/cron.hourly будет запускаться каждый час на первой минуте часа.
    * содержимое каталога /etc/cron.daily будет запускаться каждый день на второй минуте четвертого часа.
    * содержимое каталога /etc/cron.weekly будет запускаться каждое воскресенье на 22'ой минуте 4'го часа.
    * содержимое каталога /etc/cron.monthly будет запускаться каждый первый день месяца на 42'ой минуте 4'го часа.

    SHELL=/bin/bash означает использовать для запуска команд /bin/bash , если переменная не указана, то значение будет взято из /etc/passwd для пользователя являющимся владельцем файла.

    HOME=/ корневой каталог для пользователя (параметр не обязательный) При необходимости доступа к специальным свойствам интерпретатора, значения переменных SHELL и HOME можно изменить, не зависимо от того, что прописано в /etc/passwd

    MAILTO=root означает кому отсылать сообщение о результате работы команд.

    Все содержимое из этих каталогов будет запускаться с правами доступа пользователя root и файлы должны иметь права доступа на "выполнение" (про права доступа читай статью http://rst.void.ru/texts/chmod.txt) Поэтому перед размещением файлов в одном из этих каталогов необходимо убедиться, что сценарии не насесут вред системе.

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

    Как отмечалось выше, размещение файлов для cron в каталогах

    /etc/cron.hourly
    /etc/cron.daily
    /etc/cron.weekly
    /etc/cron.monthly


    доступно только пользователю root, для использования файлов crontab пользователями, нужно использовать команду crontab. Команда служит для создания, изменения и добавления файла для демона cron

    Рассмотрим пример создания файла crontab для пользователя user ,домашняя директория /home/user

    Задача: запускать каждую минуту файл /home/user/mail, который будет отправлять почту

    #содержимое файла mail (файл должен быть с правами на запуск! например -rwxr-xr-x)
    #!/bin/bash
    mess="test cron"
    echo "$mess" |mutt -s "subj" -m application/octet-stream [email protected]


    1.Создаем временный файл /home/user/test содержимое файла test такое:

    SHELL=/bin/bash
    MAILTO=user
    0-59 * * * * /home/user/mail


    2. Запускаем в терминале команду crontab /home/user/test

    Все. После этого в каталоге /var/spool/cron будет создан файл "user" примерно с таким содержимым

    # DO NOT EDIT THIS FILE - edit the master and reinstall.
    # (/home/user/test installed on Mon Mar 29 02:31:34 2004)
    # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
    SHELL=/bin/bash
    MAILTO=user
    0-59 * * * * /home/user/mail


    и файл /home/user/mail будет запускаться демоном cron каждую минуту.

    Доступ в каталог /var/spool/cron непривилегированому пользователю закрыт, что бы посмотреть юзером "user" есть ли у него файл crontab ,достаточно набрать команду crontab -l , если файл существует-будет показано его содержимое.

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

    Для редактирования crontab -e

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

    -------------------------
    crontab -u user_name file -создание файла crontab
    ------------------------- из файла "file" для
    юзера "user_name"


    u означает чей crontab будет обработан, Если опция не задана, то будет обработан crontab того пользователя, который запустил команду crontab.

    -------------------------
    crontab -u user_name -l -просмотр файла crontab
    ------------------------- юзера "user_name"

    -------------------------
    crontab -u user_name -r -удаление файла crontab
    ------------------------- юзера "user_name"

    -------------------------
    crontab -u user_name -e -редактирование файла crontab
    ------------------------- юзера "user_name" используя
    редактор, заданный переменной
    окружения VISUAL или EDITOR


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

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

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

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

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


    Каждое из полей даты и времени может быть обозначено символом * ,будет соответствовать любому возможному значению. Для этих полей можно указывать диапазоны значений, разделенных дефисом, например:

    * 5 4-10 0-3 * echo "HELLO" -печать HELLO в 5:00 на 4,5,6,7,8,9,10
    дни января, февраля, марта и апреля

    пошаговая запись

    * */2 * * sat echo "HELLO" -печать HELLO каждый четный час,
    каждую субботу


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

    В файле /var/log/cron записано время запуска всех заданий cron за предыдущий день

    Mar 29 04:03:00 rst CROND[4434]: (user) CMD (/home/user/mail)
    Mar 29 04:03:59 rst CROND[4493]: (user) CMD (/home/user/mail)
    Mar 29 04:05:00 rst CROND[4507]: (user) CMD (/home/user/mail)
    Mar 29 04:06:00 rst CROND[4549]: (user) CMD (/home/user/mail)


    В остальных файлах cron1,cron2 находится подобная информация, но более старая чем в cron

    Вот практически и все, что требуется знать для использования cron и crontab.

    [Не работает крон]

    Пишите полные пути к файлам, например /usr/local/bin/wget вместо wget Узнать, где находится файл Вы можете командой whereis, например whereis wget

    Бывает что на это время на сервере уже назначено слишком много заданий, например

    */2 * * * * cd /home/acc/domain.com/cgi-bin/fet/secured && /usr/local/bin/php -q /home/acc/domain.com/cgi-bin/fet/secured/mastercron.php


    все процессы запускаются одновременно и им может просто не хватить на всех ресурсов в этом случае перед командой крона вставьте небольшую задержку, например
    */2 * * * * sleep 49; cd /home/acc/domain.com/cgi-bin/fet/secured && /usr/local/bin/php -q /home/acc/domain.com/cgi-bin/fet/secured/mastercron.php

    [Как разносить задания cron по времени?]
    Не запускайте 100 крон-заданий в одно и то же время. Лучше равномерно их распределите. Если надо чтоб запускалось раз или несколько раз в час - делайте это в разные минуты:
    11 * * * * command - запустится на одинадцатой минуте
    23,46,9 * * * * command - на 23,46 и 9 минуте соответственно.
    Если есть скрипты которые надо запускать каждую минуту - распределяйте их вдоль этой минуты командой задержки sleep
    * * * * * sleep 20; command - запустится на 20-й секунде минуты.
    Разнесение кронов по времени позволяет снизить нагрузку на сервер.

    Источники:
    htmlbasix.com
    advancedhosters.com
    codenet.ru
     
    #1 banned, 19 Apr 2007
    Last edited by a moderator: 20 Apr 2007
  2. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    хм, практически копипаст? =\ это не фак, ибо "вопрос:ответ" нету..
     
    #2 iv., 20 Apr 2007
    Last edited: 20 Apr 2007
  3. Thanat0z

    Thanat0z Негрин

    Joined:
    6 Dec 2006
    Messages:
    627
    Likes Received:
    498
    Reputations:
    311
    Перенес в Чужие Статьи, потому что это почти 100% копипаст с другим источников.
     
    #3 Thanat0z, 20 Apr 2007
    Last edited: 20 Apr 2007