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

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

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

Пожалуй в любом более менее крупном проекте возникает необходимость выполнения заданий по крону, т. е. независимо от действий пользователей с определенной периодичностью. Совершенно определенно что результат выполнения скриптов необходимо отслеживать, что бы вовремя узнать о возникшей проблеме. Самый простой вариант, это генерация отчета о работе или ошибки в скрипте и отправке из крона на почту, как то так (из крона, а не из скрипта потому что 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 С удовольствием приму вариант более элегантного решения. :)

Tags: , ,

Leave a Reply