В течение последнего года или около того я пытался изучить сценарии 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"