Всем привет! Знаю, в интернете есть как минимум два готовых скрипта с описанием для мониторинга postfiх, но пишу свой, чтобы разобраться в вещах, с которыми еще не сталкивался ранее.
Первый вариант логики скрипта был таков: собираем стату по cron с помощью Pflogsumm раз в 5 и 10 минут, результат записываем в два разных файла. Далее скрипт на баше прочесывает результаты двух файлов (с результатами от pflogsumm), сверяет разницу между значениями, делает вычисления, получившиеся результаты пишет в файлики, которые читает заббикс-агент. Все работает, пишет, но проблема - каждые 10 минут я получаю 0 по всем параметрам, это связано с тем, что результат за 5 и 10 минут совпал по выводу.
Решил переписать, и сразу немного облагородить текст скрипта. Хотел уйти от постоянной сверки старых и новых значений, но не могу. В 00 происходит смена суток, в это время pflogsumm пересоберет статистику, уже за новый день. Проблема получается, если в 23:55 у меня было значение 50 rejected, а в 00:00 значение rejected = 1, и тогда я получу 49 reject'ов в 00:00, что неправильно.
Первая версия скрипта:
## BYTES RECEIVED
TEMP_RECEIVED=$(/bin/grep "bytes received" /tmp/postfix/temp5 | awk '{print $1}')
DATY_RECEIVED=$(/bin/grep "bytes received" /tmp/postfix/temp10 | awk '{print $1}')
DELTA1_RECEIVED=$(($TEMP_RECEIVED - $DATY_RECEIVED))
DELTA2_RECEIVED=$(($DATY_RECEIVED - $TEMP_RECEIVED))
if [ "$TEMP_RECEIVED" -eq "$DATY_RECEIVED" ]
then
echo "0" > /tmp/postfix/postfix.bytes.received
else
if (($TEMP_RECEIVED > $DATY_RECEIVED))
then
echo $DELTA1_RECEIVED > /tmp/postfix/postfix.bytes.received
else
echo $DELTA2_RECEIVED > /tmp/postfix/postfix.bytes.received
fi
fi
И так для каждого параметра, который мониторится.
Новая версия предполагает:
##Old data of Received
BYTES_R=$(< /tmp/postfix/postfix.bytes.received)
##Get new values
ResPF=$(/usr/sbin/pflogsumm -h 0 -u 0 -d today --bounce_detail=0 --deferral_detail=0 --reject_detail=0 --smtpd_warning_detail=0 --no_no_msg_size /var/log/mail.log)
## Transmitt new values in variables
BYTES_RN=$(/bin/grep "bytes received" $ResPF | awk '{print $1}')
##Сравниваем старые и новые значения
if [ "$BYTES_RN -ne $BYTES_R" ]
then
echo $((BYTES_RN - BYTES_R)) | tr -d \- > /tmp/postfix/postfix.bytes.received
else
echo "0" > /tmp/postfix/postfix.bytes.received
fi
Пример неправильного вывода из скрипта - когда старое значение = 50, новое значение в 00:00 = 1, в графике заббикса я получу 49, а должен 1. Как элегантно обсчитать это вот все безобразие, которое у меня навелосипедилось?