diff --git a/backup/backup.sh b/backup/backup.sh index ef38078..4bcc469 100644 --- a/backup/backup.sh +++ b/backup/backup.sh @@ -294,10 +294,39 @@ create_archive() { return 1 fi - log "开始打包:$archive" - local tar_err - tar_err="$(tar -czf "$archive" "${paths[@]}" 2>&1)" + # 估算源大小用于显示百分比(失败则只显示已写入字节) + local src_kb=0 + src_kb="$(du -sk "${paths[@]}" 2>/dev/null | awk '{s+=$1} END{print s+0}')" + if [[ "$src_kb" -gt 0 ]]; then + log "开始打包:$archive(源约 $(awk -v k="$src_kb" 'BEGIN{printf "%.1fG", k/1024/1024}'))" + else + log "开始打包:$archive" + fi + + local tar_log="${archive}.tar.log" + : > "$tar_log" + tar -czf "$archive" "${paths[@]}" 2>"$tar_log" & + local tar_pid=$! + + local start_ts=$(date +%s) cur_kb pct elapsed + while kill -0 "$tar_pid" 2>/dev/null; do + sleep 5 + kill -0 "$tar_pid" 2>/dev/null || break + cur_kb="$(du -k "$archive" 2>/dev/null | awk '{print $1+0}')" + elapsed=$(( $(date +%s) - start_ts )) + if [[ "$src_kb" -gt 0 ]]; then + pct=$(awk -v c="$cur_kb" -v s="$src_kb" 'BEGIN{p=c*100/s; if(p>99)p=99; printf "%.0f", p}') + log "打包进度:已写入 $(awk -v k="$cur_kb" 'BEGIN{printf "%.2fG", k/1024/1024}') / $(awk -v k="$src_kb" 'BEGIN{printf "%.2fG", k/1024/1024}') (${pct}%),耗时 ${elapsed}s" + else + log "打包进度:已写入 $(awk -v k="$cur_kb" 'BEGIN{printf "%.2fG", k/1024/1024}'),耗时 ${elapsed}s" + fi + done + + wait "$tar_pid" local rc=$? + local tar_err + tar_err="$(cat "$tar_log" 2>/dev/null)" + rm -f "$tar_log" if [[ $rc -ne 0 ]]; then err "打包失败 (rc=$rc): $tar_err" return 1 @@ -305,7 +334,7 @@ create_archive() { if [[ -n "$tar_err" ]]; then dbg "tar 输出: $tar_err" fi - ok "打包完成:$archive ($(du -h "$archive" | awk '{print $1}'))" + ok "打包完成:$archive ($(du -h "$archive" | awk '{print $1}')),总耗时 $(( $(date +%s) - start_ts ))s" ARCHIVE_FILES=() if [[ -n "$COMMON_SPLIT_SIZE" ]]; then