Bash для цикла с несколькими условиями - PullRequest
1 голос
/ 06 мая 2020

Я практически новичок в bash сценариях и все еще учусь, но я пытаюсь решить относительно простую задачу, но за пределами моего понимания.

У меня есть выходной файл с идентификатором, именем машины и настроенным временем mysql дампа, который выглядит так:

id;server.name;time_in_hour

для каждой отдельной строки файла.

Мне нужен l oop, который сравнивает "time_in_hour" с отметкой времени файлов в папке "server.name" на резервной машине. Путь к файлам резервных копий выглядит так:

/dumps/server.name/2020-05-06___10-49-00___sys.sql.gz

Если файлов резервных копий макс. time lenght 2x "time_in_hour" (пример: фактическое время -4 часа для каждого файла дампа в папке с двухчасовым расписанием резервного копирования) или, если резервной копии нет вообще, скрипт выведет ошибку для вывода. В идеальном случае второе условие скрипта проверяет конец каждого файла дампа на целостность, что-то вроде строки grep «Дамп завершен».

Пример конца файла дампа:

/ * ! 40101 НАБОР CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS /; / ! 40101 НАБОР COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION /; / ! 40111 SET SQL_NOTES=@OLD_SQL_NOTES * /;

- Дамп завершен 2020-03-02 23: 58: 29

Я все еще не совсем уверен, какие инструменты лучше для решения задачи «свидание» или «найти»? Или как на практике построить этот тип? Вложенного l oop? с несколькими условиями ... не могли бы вы привести мне пример?

1 Ответ

0 голосов
/ 11 мая 2020

Я все еще не совсем уверен, какие инструменты лучше подходят для выполнения задачи 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

Это будет перебирать данный список хостов, проверять, есть ли файлы резервных копий, а также проверять если файл действительный и не слишком старый. Вы можете изменить или расширить его для своих нужд.

Благодаря

...