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