Рейтинг:0

Сценарий Bash rsync не будет выполняться на больших резервных копиях

флаг us

В течение последнего года или около того я пытался изучить сценарии bash в Ubuntu (один ящик 20.04 LTS и один 21.04). Я чувствую, что мои навыки неплохо развиваются, но я не в своем уме с одним конкретным сценарием резервного копирования, который я написал.

Короче говоря, если сценарий резервного копирования пытается сделать резервную копию только моего каталога /home, он работает гладко от начала до конца, но если он пытается сделать резервную копию моего каталога /, он работает до завершения процесса rsync (включая создание файла журнала). ), а затем кажется, что сценарий просто останавливается, хотя у меня есть некоторый вспомогательный код, который следует, чтобы предупредить меня. Я даже добавил выходную ловушку, но она не срабатывает.

Я не знаю, чего мне не хватает, но я очень хочу научиться, если кто-нибудь может мне помочь.

Не знаю, поможет ли, но вот немного упрощенная версия моего скрипта:

#!/бин/баш
#
# резервный
# унифицированная резервная копия, домашняя и/или корневая папки для рейда на Бетти
# запускается ежедневно из sudo crontab (время зависит от устройства); день месяца определяет, какое резервное копирование выполняется
#
# связанные файлы
# создает файл backup.log в домашней папке основного пользователя, архивирует существующий файл backup.log в папку журналов в формате yyyy-mm-dd-backup.log
# требуется два файла в $homefold: home-backup.exclude и boot-backup.exclude, чтобы обеспечить исключения резервного копирования для rsync
#
# выйти из ловушки
функция badquit {
   если [[ "$1" = "тест" ]] ; тогда
      выход 0
   Элиф [[ "$ goodflag" = "0" ]] ; тогда
      echo "$(date +%r): $shname завершилось с хорошим флагом=0" > $logfold/$shname.quit
   фи
}
ловушка бэдвыйти ВЫХОД
#
# переменные
host="$(имя хоста)"
hostlc="${хост,,}"
shname="$(базовое имя $0)"
hostuser="$(получить пароль "1000" | вырезать -d: -f1)"
homefold="/home/$hostuser"
logfold="$homefold/журналы"
log="$homefold/$shname.log"
date="$(дата +%Y-%m-%d)"
dom="$(date +%d)" # день месяца во время выполнения определяет, какое резервное копирование выполняется (ежедневно, еженедельно, ежеквартально)
скороварн="7" # дней до создания отчета .soon
case $host in # Расположение $bumount зависит от устройства: Бетти монтирует его не так, как все остальные
   Бетти)
      бумаунт="/мнт/рейд"
      ;;
   *)
      bumount="/media/бетти-рейд"
      ;;
эсак
bufold="$bumount/$hostlc"
goodflag="0" # статус goodflag по умолчанию для запуска неожиданного сообщения о выходе
#
# предпроверка
# подтвердить существование $bufold, попытаться смонтировать, если не найдено, установить сообщение о сбое, если не удалось
если [[ ! -e $bufold ]] ; тогда
   смонтировать 192.168.x.x:/mnt/raid $bumount
   спать 5
   если [[ ! -e $bufold ]] ; тогда
      echo "$(date +%r): $shname завершилось, поскольку $bufold не удалось смонтировать" > $logfold/$shname.quit
      хороший флаг = "1"
      выход 1
   фи
фи
# 
# управление журналом
если [[ -e $log ]] ; тогда
   mv $log $logfold/"$(date -r $log +"%Y-%m-%d")"-$shname.log
фи
#
# основные задачи
# установить targdom для старого расписания резервного копирования загрузки (чтобы оставить время для .soon)
case $host в
   Бетти)
      таргдом="8"
      ;;
   Вероника)
      таргдом="12"
      ;;
   *)
      echo "$(date +%r): $shname не может идентифицировать $host" > $logfold/$shname.quit
      хороший флаг = "1"
      выход 1
      ;;
эсак   
# определить, какую резервную копию запускать, установить окончательные переменные
если [[ "$dom" = "$targdom" ]] ; затем # targdom запускает неежедневное резервное копирование
   если [[ $(дата +%m) -eq "01" ]] || [[ $(дата +%m) -eq "04" ]] || [[ $(дата +%m) -eq "07" ]] || [[ $(дата +%m) -eq "10" ]] ; затем # ежеквартальное резервное копирование загрузки январь, апрель, июль, октябрь
      ropts="-avuHkbi --delete --exclude-from=$homefold/boot-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log" 
      источник = "/"
   else # ежемесячная домашняя резервная копия
      ropts="-axvuHkbi --delete --exclude-from=$homefold/home-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log"
      rsource="/дом"
   фи
else # не таргдом, ежедневный домашний бекап
   ropts="-axvuHkbi --exclude-from=$homefold/home-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log" #ежедневное домашнее резервное копирование
   rsource="/дом"
фи
# если это тест, установите переменные соответствующим образом
если [[ "$1" = "тест" ]] ; тогда
   ropts="-navuHkbi --exclude-from=$homefold/boot-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log" # Пробный запуск ВКЛ.
   источник = "/"
фи
# запускаем бэкап, наконец
rsync $ropts --backup-dir=$bufold/Backup.$date --log-file=$log $rsource $bufold
#
# установить выход
если [[ "$?" = "0" ]] ; тогда
# успешно, журнал сохранен
   exitcond="успешно, журнал сохранен"
еще
# неудачно, выйти из условия
   exitcond="неудачно, код выхода $?"
фи
#
echo "$(date +%r): $shname завершено $exitcond" >> $logfold/$shname.done
хороший флаг = "1"
sudodus avatar
флаг jp
Когда вы пытаетесь сделать резервную копию корневого раздела `/`, там также будут активные системные файлы, которые будут изменены процессом rsync. Так что **либо исключите каталоги с такими файлами (например, `/run` и `/proc`), либо загрузитесь с другой системы** (например, работающая система, загружаемая с USB, или вторая система в системе с двойной загрузкой). Я предполагаю, что вы уже запускаете скрипт с помощью `sudo`, чтобы можно было прочитать все файлы и сохранить все разрешения и права собственности.
Thomas Aichinger avatar
флаг cn
Мое первое предположение состоит в том, что есть некоторые файлы, которые нельзя скопировать (сокеты, устройства). Чтобы отследить эту проблему, попробуйте удалить скрипт bash и написать всего одну строку rsync --with-all-paramteters. Тогда попробуй воспроизвести эту ошибку и выложи сюда.
Artur Meinild avatar
флаг vn
+1 за исключение системных каталогов. Подробнее [информацию о файловой системе] смотрите здесь (https://www.linux.com/training-tutorials/linux-filesystem-explained/). Я бы предположил, что `/dev`, `/proc`, `/run` и `/sys` всегда следует исключать, так как это все виртуальные файловые системы.
KneadToKnow avatar
флаг us
Я опубликую свой файл .exclude сегодня вечером, когда смогу вернуться к нему. Я думаю, что я сохранил большинство упомянутых каталогов вне резервной копии. Возможно, я наткнулся на что-то, когда изучал то, что я считал другой проблемой: я думаю, что попытка сделать резервную копию каталога /usr/bin/x11 может создать бесконечный цикл, что, безусловно, объясняет, почему скрипт никогда не завершается. .
KneadToKnow avatar
флаг us
Что ж, когда я пошел за своим файлом .exclude, я обнаружил, что скрипт на самом деле все еще работает, проработав на тот момент около 17 часов. Мне нужно было заняться другими делами, но из своего программного обеспечения для ведения домашнего хозяйства я знаю, что оно все еще работало, когда сегодня в 13:00 началось регулярное ночное резервное копирование, поэтому мне нужно будет заняться всем этим завтра, когда я смогу. сядьте и изучите все журналы. Я все еще подозреваю, что реальная проблема заключается в том, что /usr/bin/x11 и, возможно, подобные каталоги, которые, надеюсь, будут решены хорошей комбинацией параметров include-file и exclude-file.

Ответить или комментировать

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