Использование CRON и команды crontab

admin, 2009-05-27 21:28:29

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

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

При загрузке системы, запускается демон 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 bob@server.ru

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 из файла "file" для юзера "user_name", -u означает чей crontab будет обработан, Если опция не задана, то будет обработан crontab того пользователя, который запустил команду crontab.

crontab -u user_name file

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

crontab -u user_name -l

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

crontab -u user_name -r

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

crontab -u user_name -e Формат и значения полей

Каждая команда в пользовательском файле 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 каждый четный час, каждую субботу

равнозначная предыдущему примеру запись (списком)

* 0,2,4,6,8,10,12,14,16,18,20,22 * * sat echo "HELLO" -печать HELLO каждый четный час, каждую субботу

то же самое с указанием диапазона

* 0-23/2 * * sat echo "HELLO" -печать HELLO каждый четный час, каждую субботу
59 23 31 dec * echo "Happy new year" -поздравит с новым годом

Для отладки задания cron, можно перенаправить результат в файл. Пример:

0-59 * * * * /home/user/mail 2>/tmp/tmp.cron

Если при запуске команды /home/user/mail возникнут ошибки, то они будут записаны в файл /tmp/tmp.cron и вы всегда сможете узнать причину. В случае перенаправления вывода в файл, письмо, юзеру указаному в переменной MAILTO отправлено не будет.

Посмотреть информацию о всех командах запускаемых демоном 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.


Тэги статьи: Linux cron 

Кратко о парадигме MVC

admin, 2009-05-21 23:13:56

Не то что бы я делаю это ради продвижения сайта по красивым словам - тема действительно важная - и для веба в целом, и для меня в частности. В начале статьи не обойдусь без парыы цитат из классики, чтобы объяснить тем, кто может пока не слышал об этом термине. Далее, расскажу своё отношение к проблеме и опишу почему же этот шаблон проектирования так важен для меня.

Model-view-controller (MVC, Модель-представление-поведение, Модель-представление-контроллер) — архитектура программного обеспечения, в которой модель данных приложения, пользовательский интерфейс и управляющая логика разделены на три отдельных компонента, так, что модификация одного из компонентов оказывает минимальное воздействие на другие компоненты.

  • Модель (Model). Модель предоставляет данные (обычно для View), а также реагирует на запросы (обычно от контроллера), изменяя свое состояние.
  • Представление (View). Отвечает за отображение информации (пользовательский интерфейс).
  • Поведение (Controller). Интерпретирует данные, введенные пользователем, и информирует модель и представление о необходимости соответствующей реакции.

Важно отметить, что как представление, так и поведение зависят от модели. Однако модель не зависит ни от представления, ни от поведения. Это одно из ключевых достоинств подобного разделения. Оно позволяет строить модель независимо от визуального представления, а также создавать несколько различных представлений для одной модели.

Что изменилось в жизни разработчиков ПО?

Вместе с тем, как существенно улучшилась читаемость кода, выросло качество продуктов, выросла скорость разработки. Существенно увеличена возможность повторного использования кода. Обычно, в таких случаях, года названо много плюсов, бывает что технология приносит и минусы, например, проигрыш в быстродействии. Но разобравшись в ситуации и проанализировав работу нескольких MVC фреймворков, стал понимать что виновата не парадигма, а только лишь непрофессиональное исполнение. Одним из следствий MVC стала возможность модульного тестирования.

Что изменилось в жизни веба?

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

С другой стороны никуда не исчез говнокод, и он всё ещё продолжает плодится. Но растёт посещаемость ресурсов, требования к количеству медиаконтента, и словно град, сыпятся заказы на реинжиниринг. Пройдёт пару лет, и технологии прошлого будут привлекать лишь единиц, так же как сегодня можно привлечь серьёзного клиента статическим сайтом.


Тэги статьи: MVC 

Несколько слов о SQL оптимизации

admin, 2009-05-20 14:53:07

Как бы это не показалось неожиданным, часто не нужно менять код приложения и SQL запросов в нём, чтобы получить основной прирост производительности. Поделюсь основными практическими рекоммендациями по увеличению скорости работы баз данных на сервере MySQL:

Первый шаг - самый важный:

  1. настройки конфигурации MySQL - увеличьте буфферы используемые базой данных для работы с индексами, ключами и ответами от запросов.
  2. чем больше настроек привилегий - тем медленнее стартует каждый запрос. Быстрее всего работает рут пользователь с полными привилегиями.
  3. Установленный из пакетов MySQL сервер будет работать медленнее, чем если вы скомпилируете его под ваш конкретный сервер. Не используйте те модули сервера, которые вам не нужны.

Второй шаг - настройка баз данных

  1. используйте индексы там, где они могут ускорить запрос. Это самое основное правило ускоряющее работу базы данных при аудите и реинжиниринге её структуры.
  2. Как бы это ни было грустно, проверьте соответствие типов: однажды мы видели VARCHAR в числовых полях. Если диапазон данных мал, и функциональность приложения не меняет его, вместо числового или текстового типа используйте SET/ENUM
  3. Реально оцените диапазон данных и используйте минимальный тип. Для положительных полей укажите опцию UNSIGNED.
  4. помните, поле для MD5 хэшированного пароля - это не VARCHAR(32), а CHAR(32);

Третий шаг - лёгкий реинжиниринг кода.

  1. Используйте триггеры, особенно каскадное удаление и каскадную замену. В коде надо закомментировать, а затем и убрать каскадное удаление.
  2. Если PHP код всегда выполняет операции над строками, отдайте эти операции MySQL, они будут выполнены быстрее.
  3. Для очень частых запросов, надо сформировать вьюшки - они работают быстрее чем таблица или структура, которую они описывают.
  4. Если данные организованы деревом в 2 уровня, надо оценить, хранить их в одной таблице или в двух. Если фреймворк приложения поддерживает маппинг, и модель описана отдельно, то изменения в коде будут минимальны.

Тэги статьи: MySQL оптимизация 

Оптимальные скрипты jQuery

admin, 2009-05-20 12:22:43

Популярный клиентский JS фреймворк jQuery позволил веб-разработчикам сфокусировать своё внимание с кроссбраузерности на юзабилити и функциональности страниц. Кода стало меньше, скорость разработки возрасла.

При разработке проектов с высокой нагрузкой, мы уделяем выходному коду (HTML, JS, CSS) особое внимание, оптимизируя его размер, так как это экономит канал, увеличивая удобство использования и снижая нагрузку на сервер. В одном из проектов нам удалось снизить объём выходного кода более чем в 4 раза.

В этой статье поделюсь некоторыми очевидными приёмами испоьзования jQuery. С помощью них можно не только писать собственные скрипты короче (а значит и понятнее, и быстрее), но и оптимизировать скрипты, которые были добавлены извне. Статья послужила началом болга и будет несомненно расширяться.

вариант до вариант после комментарий
$(...).bind('click', function(){
});
$(...).click(function(){
});
метод bind() сделан для расширения функциональности пользовательскими событиями. Большинство стандартных событий в jQuery уже есть.
$(...).attr('value');
$(...).attr('value', content);
$(...).val();
$(...).val(content);
Тот же пример использования готовых методов.
$.get(url, function(data){
    $(layout).html(data);
});
$(layout).load(url); В jQuery пожалуй самые изящные механизмы вызова ajax, не нужно забывать про них.
$(...).css('display', 'none');
$(...).css('display', 'block');
$(...).hide();
$(...).show();
действие то же, изящность и простота - очевидны.
{'title':$('#title').val(),
'www':$('#www').val(),
'description':$('#description').val()}
{title:$('#title').val(),
www:$('#www').val(),
description:$('#description').val()}
при описании объектов, даже создаваемых "на лету", заключать в кавычки название свойств не обязательно.
$('ul li#' + n);
$('ul li#1').show();
$('ul li').eq(n);
$('ul').first('li').show();
номер тега в контейнере позволит убрать свойство id у каждого элемента. Мы стремимся к постоте кода.
$(this).width(200);
$(this).css('color', '#ff0000');
$(this).show();
$(this).width(200).css('color', '#ff0000').show(); помним про то, что большинство методов возвращает объект.
$(this).css('color', '#ff0000');
$(this).css('border', '1px solid #0000ff');
$(this).css({color : '#ff0000', border : '1px solid #0000ff'}); помним про полиморфизм методов.

Тэги статьи: jQuery оптимизация 

 
  темы блога
все записи4
архитектура по1
программирование2
тестирование0
администрирование1
управление проектами0


  облако тегов


мы рекомендуем VPS хостинг:
VPS Hosting Referral Code D0V2GG
© phpcmf.com | вход для пользователей Rambler's Top100