bugfix: вывод в файл и на экран

This commit is contained in:
root 2024-10-30 00:44:00 +03:00
parent 1024043ab2
commit 59da941114

View File

@ -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