Найти в Дзене
Кулибин74

Простой контроль резервных копий на bash+ Zabbix.

Доброго дня. Потребовался простой контроль резервных копий на сервере Linux. Данный скрипт раз в сутки после выполнения резервных копий считывает размер файла резервных копий, и полученное значение записывает во вторую строку файла controlSizeBackup.log. Изначально структура файла controlSizeBackup.log выглядит так.

3200MB # предыдущее значение которое было во второй строке
3205MB #новое значение размер файла резервных копий

Сам скрипт

#!/bin/bash
# Берем значение из второй строки и записываем его в первую
line_to_copy=$(sed -n 2p */controlSizeBackup.log)
sed -i "1s/.*/$line_to_copy/" */controlSizeBackup.log
# Получаем новое значение по размеру файла
replacement=$( find */backup -type f -exec stat -c %s {} + | awk '{total += $1} END {printf "%.2f MB\n", total/1024/1024}')
sed -i "2c $replacement" */controlSizeBackup.log
# Сравниваем значения размеров из двух строк, убираем символы, заменяем запятые на точки
sizeOld=$(awk 'NR==1 {print $1}' */controlSizeBackup.log | tr -d 'a-zA-Z' | tr ',' '.')
sizeNew=$(awk 'NR==2 {print $1}' */controlSizeBackup.log | tr -d 'a-zA-z' | tr ',' '.')
# Сравниваем значения размеров
if [ $(echo "$sizeNew > $sizeOld" | bc -l) -eq 1 ]; then
echo "0" > */statusBackup.log
else
echo "1" > */statusBackup.log
fi

С помощью утилиты sed получаем значение из второй строки чтобы записать его в первую строку.

line_to_copy=$(sed -n 2p /home/backup/controlSizeBackup.log)
sed -i "1s/.*/$line_to_copy/" /home/backup/controlSizeBackup.log

Далее в указанной директории ищем все файлы чтобы получить их общий размер "/backup/backup_sql.001/USB". С помощью команды stat -c %s {} + мы получаем информацию о файлах а именно размер файла в байтах. Далее суммируем Далее этой командой awk '{total += $1} END {printf "%.2f MB\n", total/1024/1024}': мы суммируем все размеры файлов которые нашли в указанном каталоге суммируем и переводим в Мегабайты с двумя знаки после запятой. И конечное значение присваиваем переменной replacement.

replacement=$( find /backup/backup_sql.001/USB -type f -exec stat -c %s {} + | awk '{total += $1} END {printf "%.2f MB\n", total/1024/1024}')

После этого полученное значение командой sed -i "2c $replacement" */controlSizeBackup.log записываем в наш файл во вторую строку.

Далее нам нужно подготовить записанные значения для выполнения операций с числовым значение, а именно получить значения в которых будут только цифры, с помощью команды awk 'NR==1 {print $1}' */controlSizeBackup.log мы считываем значения в первой строке из нашего файла, удаляем буквы с помощью команды tr -d 'a-zA-Z' и меняем запятую на точку с помощью команды tr ',' '.' и далее записываем значение в переменную sizeOld. Та же самая операция проводится и для второй строки и записывается значение в sizeNew.

sizeOld=$(awk 'NR==1 {print $1}' */controlSizeBackup.log | tr -d 'a-zA-Z' | tr ',' '.')
sizeNew=$(awk 'NR==2 {print $1}' */controlSizeBackup.log | tr -d 'a-zA-z' | tr ',' '.')

Следующий шаг это сравнение значений и запись значения в файл с которым уже будет работать zabbix. Если новое значение больше старого то все нормально записываем 0, если нет то записываем 1.

if [ $(echo "$sizeNew > $sizeOld" | bc -l) -eq 1 ]; then
echo "0" > */statusBackup.log
else
echo "1" > */statusBackup.log
fi

В zabbix создаем элемент данных, используем ключ vfs.file.regmatch[*/statusBackup.log,0] ищем значение 0.

После этого создаем триггер last(/utl_backup/vfs.file.regmatch[*/statusBackup.log,0])<>1 если значение не найдено то возвращаем 0 если найдено то 1. Триггер срабатывает если значение не равно 1.

-2