From 1738c35abbd3705d93bf87e7927de00d7a05667e Mon Sep 17 00:00:00 2001 From: root Date: Mon, 14 Jul 2025 16:28:06 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20*=20=D0=A1=D0=B5=D1=80=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D1=83=D0=BC=D0=BE=D0=BB=D1=87=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8E=20120=20*=20=D0=9D=D0=B5=20=D0=B2=D1=8B=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D0=B8=D0=BB=20=D0=B8=D0=B7=20=D1=81=D0=BA=D1=80?= =?UTF-8?q?=D0=B8=D0=BF=D1=82=D0=B0=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B0=20=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8=20-h,=20=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B4?= =?UTF-8?q?=D0=BE=D0=BB=D0=B6=D0=B0=D0=BB=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=20*=20=D0=A3=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B2=D0=BE=D0=B4=D0=B0=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D0=B8=D0=BA=D0=B8=20(invalid=20date=20=E2=80=98@954.)=20?= =?UTF-8?q?*=20=D0=92=D1=8B=D1=85=D0=BE=D0=B4=20=D0=B8=D0=B7=20=D0=B1?= =?UTF-8?q?=D0=B5=D1=81=D0=BA=D0=BE=D0=BD=D0=B5=D1=87=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=86=D0=B8=D0=BA=D0=BB=D0=B0=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20(=D1=82=D0=B5=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D1=8C=20=D1=87=D0=B8=D1=82=D0=B0=D0=B5=D1=82=20i=5Ftask?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=BA=D0=B0=D0=B6=D0=B4=D0=BE=D0=B9=20=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D1=80=D0=B0=D1=86=D0=B8=D0=B8)=20*=20=D0=9E?= =?UTF-8?q?=D1=87=D0=B8=D1=89=D0=B0=D0=B5=D1=82=20=D0=B2=D1=80=D0=B5=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=BF=D0=BE=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=88=D0=B5=D0=BD=D0=B8=D0=B8=20=D1=81=D0=BA?= =?UTF-8?q?=D1=80=D0=B8=D0=BF=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + zfs_send.zsh | 47 ++++++++++++++++++++++++++++------------------- 2 files changed, 29 insertions(+), 19 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c802e8f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +log* diff --git a/zfs_send.zsh b/zfs_send.zsh index 78a7b30..e9a4512 100755 --- a/zfs_send.zsh +++ b/zfs_send.zsh @@ -2,16 +2,12 @@ #TODO list # 1. Скрипт не определяет, что нужно остановиться -# 2. Возникают ошибки: -# sending main_pool/3D_Design@manual-20250327 (99%: 21.9G/21.9G) 25.6M/s date: invalid date ‘@0.’ -# date: invalid date ‘@954.’ -# sending main_pool/3D_Design@manual-20250327 (100%: 21.9G/21.9G) 25.6M/s date: invalid date ‘@-1.’ -# date: invalid date ‘@954.’ -# 3. Нужно автоматически определить, если копирование уже запущено то предложить остановить и вывести процесс резервирования +# 2. Нужно автоматически определить, если копирование уже запущено то предложить остановить и вывести процесс резервирования +# Нет проверки на верность введённых параметров # смотреть нужно сразу на всей системе. Не будем запускать несколько параллельных резервирований. -backup_server="192.168.0.162" # Сервер для резервирования +backup_server="192.168.0.120" # Сервер для резервирования backup_user="root" # Пользователь на сервере inc_snapshot="manual-$(date +%Y%m%d)" # Новый создаваемый снисмок incremental=false @@ -51,7 +47,7 @@ while [[ "$#" -gt 0 ]]; do echo " --no-check"; echo " --stop"; echo "-i | --incremental" ; - echo "-p | --progress" ;; + exit 0;; *) echo "Неизвестные параметры: $1"; exit 1 ;; esac shift @@ -90,16 +86,20 @@ find_ssh_key() { done # Если ключей нет, создаем новый - # echo "Создаём новый ключ..." - ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519 >&2 - echo "~/.ssh/id_ed25519" + if [ ! -f ~/.ssh/id_ed25519 ]; then + ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519 + # echo "Создаём новый ключ..." + ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519 >&2 + echo "~/.ssh/id_ed25519" + else + echo "Ключей для этого сервера не найдено. Ключ по умолчанию ~/.ssh/id_ed25519 уже существует. Создание нового ключа прервано" + fi } # Определение ключа key_path=$(find_ssh_key) key_pub_path="${key_path}.pub" - check_ssh_connection() { ssh -o "BatchMode=yes" -o "ConnectTimeout=5" "$backup_user@$backup_server" exit 2>/dev/null return $? @@ -451,8 +451,8 @@ echo $pids time_changed_percent_value=$TS1 n_tasks=$(< /dev/shm/backup_n_tasks) - i_task=$(< /dev/shm/backup_i_task) - while [[ $i_task != $n_tasks ]]; do # выводим статус пока не завершены все задачи + while [[ $i_task -lt $n_tasks ]]; do # выводим статус пока не завершены все задачи + i_task=$(< /dev/shm/backup_i_task) progress=$(ps -u | grep "sending" | grep -v "grep" | sed -r "s/(.*) zfs: (.*)/\2/") # Извлекаем объем и процент @@ -539,8 +539,15 @@ echo $pids elapsed_total=$(( $(date +%s) - TS1 )) fi time_part_of_percent=$(( now - time_changed_percent_value )) # Время с последнего изменения процента - estimated_total=$(( 100 / percent * elapsed_total )) # Всего времени на задачу - estimated_remain=$(( estimated_total - elapsed_total - time_part_of_percent )) # Осталось времени на задачу + # Используем awk для более точных расчётов + # estimated_total - Всего времени на задачу + # estimated_remain - Осталось времени на задачу + read estimated_total estimated_remain <<< $(awk -v p="$percent" -v t="$elapsed_total" -v tp="$time_part_of_percent" ' + BEGIN { + total = (p > 0 ? (100 / p * t) : 0); + remain = (total > 0 ? (total - t - tp) : 0); + printf("%d %d", total, remain) + }') if (( estimated_remain >= 86400 )) || (( estimated_total >= 86400 )); then # Если осталось более чем сутки, то отобразить дни estimated_remain_days=$(( estimated_remain / 86400 )); estimated_remain_time=$(( estimated_remain % 86400 )) estimated_total_days=$(( estimated_total / 86400 )); estimated_total_time=$(( estimated_total % 86400 )) @@ -564,9 +571,11 @@ echo $pids fi # Удалить временные файлы состояний, если они существуют - [ -f /dev/shm/backup_i_task ] && rm /dev/shm/backup_i_task - [ -f /dev/shm//dev/shm/backup_time_start ] && rm /dev/shm/backup_time_start - [ -f /dev/shm//dev/shm/backup_time_circle ] && rm /dev/shm/backup_time_circle + [ -f /dev/shm/backup_i_task ] && rm /dev/shm/backup_i_task + [ -f /dev/shm//dev/shm/backup_time_start ] && rm /dev/shm/backup_time_start + [ -f /dev/shm//dev/shm/backup_time_circle ] && rm /dev/shm/backup_time_circle + # Обнуляем переменные после завершения задачи, чтобы избежать ошибок при повторном запуске + unset last_volume last_volume_time last_update_time last_percent time_changed_percent_value fi