Доброго дня. Потребовался простой контроль резервных копий на сервере 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.