From 59da9411145f991cc4e90a6eae405d9b25725697 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 30 Oct 2024 00:44:00 +0300 Subject: [PATCH] =?UTF-8?q?bugfix:=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=B2=20=D1=84=D0=B0=D0=B9=D0=BB=20=D0=B8=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=8D=D0=BA=D1=80=D0=B0=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backup_data.zsh | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/backup_data.zsh b/backup_data.zsh index 20d3fba..2601919 100755 --- a/backup_data.zsh +++ b/backup_data.zsh @@ -55,7 +55,7 @@ for loc_ds bak_ds in ${(kv)work_datasets}; do if [[ "$loc_snap" = "$inc_snapshot" ]]; then # Если последние снимки на обеих машинах совпадают if [[ "$loc_snap" = "$bak_snap" ]]; then - echo "${loc_ds}@${loc_snap} существует на обеих машинах. $loc_ds Исключено из списка" + echo "${loc_ds}@${loc_snap} * существует на обеих машинах. Исключено из списка резервируемых" unset "work_datasets[$loc_ds]" else # Если на удалённой машине нет такого снимка, то предложить удалить. @@ -118,20 +118,24 @@ fi if [[ $work = "y" || $work = "Y" ]]; then TS0=$(date +%s) - LOGFILE="log_${inc_snapshot}_backup.txt" + LOGFILE="backup_${inc_snapshot}.log" echo "Результат работы записываю в файл $LOGFILE" # Записать в файл список резервируемых датасетов + echo "--- $(date +'%Y.%m.%d %H:%M.%S') ---" >> "${LOGFILE}" echo "Список резервируемых датасетов:" >> "${LOGFILE}" + n_tasks=0 for loc_ds in ${(k)work_datasets}; do + n_tasks=$((n_tasks+1)) echo "$key \t ${last_loc_snaps[$loc_ds]} \t -> \t${work_datasets[$loc_ds]}" >> "${LOGFILE}" done echo exec 6>&1 # Saves stdout - exec > >(tee $LOGFILE) # stdout replaced with file + exec >&1 >>$LOGFILE 2>&1 # Вывод на экран и в файл echo "\n--- Резервирую данные ---" + i_task=0 # Выполненных зачач for loc_ds bak_ds in ${(kv)work_datasets}; do TS1=$(date +%s) echo " * snapshot ${loc_ds}@${inc_snapshot}" @@ -139,21 +143,27 @@ if [[ $work = "y" || $work = "Y" ]]; then echo " * Start sending ${loc_ds} at $(date +'%Y.%m.%d %H:%M.%S')" zfs send -V -i ${loc_ds}@${last_loc_snaps[$loc_ds]} ${loc_ds}@${inc_snapshot} | ssh "root@${backup_server}" zfs receive ${bak_ds}@${inc_snapshot} TS2=$(date +%s) - echo "Закончил ${loc_ds} за: $(date -d@$(($TS2-$TS1)) -u +%H:%M:%S)" + i_task=$((i_task+1)) + echo "------ готово за: $(date -d@$(($TS2-$TS1)) -u '+%H:%M:%S') " done & # Запустить резервирование в фоне - exec 1>&6 6>&- + exec 1>&6 # Restore stdout. Не писать в файл лога отследивание процента # Выводить прогресс запрашивая список запущенныйх процессов - while pgrep -u $USER zfs >/dev/null; do + + while [[ $i_task != $n_tasks ]]; do PROGR=$(ps -u | grep "send" | grep -v "grep" | sed -r "s/(.*) zfs: (.*)/\2/") - echo -ne "$PROGR\033[0K\r" - sleep 60 + echo -ne "$PROGR" + dots_per_min=10 + for ((i = 0; i < dots_per_min; i++)); do echo -n "."; sleep ((60 / dots_per_min)); done + echo -e "\r"; done - echo -e - exec > >(tee $LOGFILE) - echo "\n---Все завершено за $(date -d@$(($TS2-$TS0)) -u +%H:%M.%S) ---" + + exec >&1 >>$LOGFILE 2>&1 # Вывод на экран и в файл + echo "\n--- Все завершено за $(date -d@$(($TS2-$TS0)) -u '+%H:%M.%S') ---" exec 1>&6 6>&- # Restore stdout and close file descriptor #6. + # sed "s/\r/\n/g" "${LOGFILE}" > "${LOGFILE}" # Заменить все возвраты каретки на символы переноса лог файле + fi