Я все еще не совсем уверен, какие инструменты лучше подходят для выполнения задачи date
или find
?
Это как-то будет зависеть от ваших требований и от того, что вы пытаетесь достичь. То есть просто создать список серверов, на которых нет фактической резервной копии, вы можете использовать что-то вроде
find dumps/* -mmin +120 -type f | cut - "/" -f 2 > noBackup.lst
Поскольку у меня были какие-то похожие требования в одной из моих сред, я хотел бы показать некоторые возможные подходы к решению.
toBackup.lst
1;test1.example.com;2
2;test2.example.com;2
3;test3.example.com;2
Так как я не совсем понимаю, что именно означает time_in_hour
, я оставлю значение, указанное в вашем описание
Если нет резервных файлов макс. продолжительность 2x time_in_hour
(пример: фактическое время -4 часа, для каждого файла дампа в папке с 2-часовым графиком резервного копирования) ...
поскольку я думаю, что должна быть резервная копия выполняется каждые 2 часа.
testBackup. sh
#!/bin/bash
BOLD='\033[0;1m'
RED='\033[0;31m'
YELLOW='\033[0;33m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color
while read LINE; # from a list
do
ID=$(echo "${LINE}" | cut -d ";" -f 1)
SERVERNAME=$(echo "${LINE}" | cut -d ";" -f 2)
TIMESLOT=$(echo "${LINE}" | cut -d ";" -f 3) # in hr
TIMESLOT=$((${TIMESLOT}*60*60)) # in sec
echo -e "${BOLD}ID ${ID}${NC}"
echo "Going to check backup of ${SERVERNAME}"
# Suppress error message if there is no directory or file
FILENAME=$(ls 2> /dev/null dumps/${SERVERNAME})
if [[ -z "${FILENAME}" ]]; then
echo -e "${RED}No file found${NC}"
# Since there is no backup file leave the loop and continue with next line from list
continue
else
echo "Backup file is ${FILENAME}"
fi
# Get backup timestamp from filename instead of modification time of the file itself
# To do so, cut out the timestamp and re-format it for further processing with date
TIMESTAMP=$(echo "${FILENAME}" | cut -d "_" -f 1-4 | sed 's/___/ /g' | sed 's/-/:/3g')
echo "Backup time is ${TIMESTAMP}"
# To be able to calculate the difference, convert timestamp and time to seconds
MTIME=$(date -d "${TIMESTAMP}" +"%s") # modification time
NOW=$(date +"%s")
DIFFERENCE=$((${NOW}-${MTIME}))
# Check if difference not more than the given ${TIMESLOT} value
echo "Allowed is an backup file age of ${TIMESLOT} sec"
if [ ${DIFFERENCE} -gt ${TIMESLOT} ]; then
echo -e "Backup file age of ${DIFFERENCE} sec is ${RED}too old${NC}"
# Since the backup filename indicates it is too old, leave the loop and continue with next line from list
continue
else
echo -e "Backup file age of ${DIFFERENCE} sec is ${GREEN}OK${NC}"
fi
# Check if the backup file contains a valid backup
# To do so, decompress the file and gather the timestamp from last line
DUMPTIME=$(gzip --decompress --to-stdout dumps/${SERVERNAME}/${FILENAME} | tail -1 | cut -d " " -f 6-)
echo "Timestamp of database dump is ${DUMPTIME}"
# Convert timestamp from within the backup file into seconds
DTIME=$(date -d "${DUMPTIME}" +"%s")
DIFFERENCE=$((${NOW}-${DTIME}))
# Here it is assumed that the decompression worked well and the file contained an timestamp
if [ ${DIFFERENCE} -gt ${TIMESLOT} ]; then
echo -e "Backup content age of ${DIFFERENCE} sec is ${RED}too old${NC}"
# Since the timestamp within the backup indicates it is too old, leave the loop and continue with next line from list
continue
else
echo -e "Backup content age of ${DIFFERENCE} sec is ${GREEN}OK${NC}"
fi
done < toBackup.lst
Это будет перебирать данный список хостов, проверять, есть ли файлы резервных копий, а также проверять если файл действительный и не слишком старый. Вы можете изменить или расширить его для своих нужд.
Благодаря