заметки на полях

Блокнот разработчика

Currently browsing shell

Упрощение отслеживания отработанных по крону скриптов

Пожалуй в любом более менее крупном проекте возникает необходимость выполнения заданий по крону, т. е. независимо от действий пользователей с определенной периодичностью. Совершенно определенно что результат выполнения скриптов необходимо отслеживать, что бы вовремя узнать о возникшей проблеме. Самый простой вариант, это генерация отчета о работе или ошибки в скрипте и отправке из крона на почту, как то так (из крона, а не из скрипта потому что fatal error на почту из скрипта не придет):

17 3    * * * www-data /usr/bin/php5-cgi /var/www/project/cron/user_rating.php 2>&1 | mail -s "Пересчет рейтинга пользователей" mail@example.com

В итоге на почту периодически будут сваливаться отчеты вида:

X-Powered-By: PHP/5.2.6-1+lenny13
Content-type: text/html

Начало: 2011-10-03 03:17.01

... сгенерированные данные о проделанной работе ...

Окончание: 2011-10-03 03:17.01

Все хорошо. Но иногда бывает что дергать такие скрипты необходимо часто (дабы избежать задержки), а вот что-то делать они будут далеко не всегда, т. е. попросту запускаться, смотреть что ничего делать не надо генерит пустой отчет и все. А вот когда этих скриптов становится много, то наступает такой момент когда только просмотреть отчеты на почте занимает неприлично много времени, потом это надоедает и отчеты просто не просматриваясь удаляются. Теряется смысл вообще всех этих отчетов.
Выход нашелся в следующем. При отсутствии действий в скрипте не генерировать пустой отчет, т. е. не выводить ничего, а по крону смотреть, что если в выхлопе только три строки:

X-Powered-By: PHP/5.2.6-1+lenny13
Content-type: text/html

то на почту ничего отправлять не надо.
Делаем скрипт /usr/bin/php_cron.sh:

#!/bin/sh

strtocut=3
# минимальная длина на всякий случай, может лишний перенос закрадется
minlen=10

line=1
while read INPUT; do
    if [ $line -gt $strtocut ]; then
        OUTPUT="${OUTPUT}\n${INPUT}"
    fi
    line=`expr $line + 1`
done

if [ `expr length "$OUTPUT"` -gt $minlen ]; then
    echo -e $OUTPUT | mail -s"$2" $1
fi

даем ему права на выполнение

$ chmod +x /usr/bin/php_cron.sh

и изменяем задание в кроне следующим образом:

17 8    * * * www-data /usr/bin/php5-cgi /var/www/project/cron/paid_notifier.php 2>&1 | /usr/bin/php-cron.sh mail@example.com "Отправка уведомлений об окончании услуг"

Теперь на почту будут приходить только сообщения о проделанной работе, а о том что делать было нефиг нас не потревожат.

P/S С удовольствием приму вариант более элегантного решения. :)

Backup проекта, часть 2

Немного ранее, был представлен SHELL скрипт резервного сохранения данных проекта. При наличии нескольких проектов хочется каким-то образом систематизировать этот процесс, для облегчения подключения новых проектов к резервному копированию, кроме как плодить файлы с дублированием кода, учитывая тот факт, что со временем может измениться логика выполняемых действий или настройки подключения к БД/FTP серверу.

Вынесем общую логику в отдельный скрипт, а индивидуальные данные проекта, такие как имя БД и загружаемые файлы в конфигурационный файл для каждого проекта.
Read more »

Backup проекта

Люди делятся на тех кто еще не делает
и тех, кто уже делает бэкапы

Обязательным свойством любого проекта являются резервное сохранение данных. И так, приступим. Допустим все данные у нас хранятся в БД (в моем случае mysql, но если это postgres – отличие будет в одной строчке) и существуют различные файлы загружаемые пользователями. Файлы проекта хранятся в репозитории, поэтому за их сохранность можно не беспокоиться (можно на всякий случай еще сохранять конфиг). Так же понадобится другая машина для сохранения бэкапов, более чем достаточно иметь FTP на другой машине.

UPD: Немного подчищен код и приведен к соответствию соглашениям.

Read more »