diff --git a/scripts/agathe_backup.sh b/scripts/agathe_backup.sh index f175bfb..9fe483d 100755 --- a/scripts/agathe_backup.sh +++ b/scripts/agathe_backup.sh @@ -89,6 +89,8 @@ TOMEDO_LAST_FILE="${TOMEDO_SRC_ROOT}/lastFilesBackup" TOMEDO_DEST_ROOT="${CIFS_MOUNTPOINT}/TomedoBackup" TOMEDO_MACOS_EXCLUDES="${TOMEDO_DEST_ROOT}/macos.excludes" TOMEDO_FILES_EXCLUDES="${TOMEDO_DEST_ROOT}/files.excludes" +TOMEDO_RSYNC_MAX_RETRIES=3 +TOMEDO_RSYNC_RETRY_SLEEP=5 # ----------------------------- # Hilfsfunktionen @@ -269,6 +271,45 @@ ensure_cifs() { fi } +run_rsync_with_cifs_retry() { + local label="$1" + shift + + local attempt rc=0 + for ((attempt=1; attempt<=TOMEDO_RSYNC_MAX_RETRIES; attempt++)); do + ensure_cifs + log "rsync ${label}: Versuch ${attempt}/${TOMEDO_RSYNC_MAX_RETRIES}" + + set +e + rsync "$@" + rc=$? + set -e + + if [[ "$rc" -eq 0 ]]; then + return 0 + fi + + if [[ "$rc" -eq 11 || "$rc" -eq 12 || "$rc" -eq 30 || "$rc" -eq 35 ]]; then + if [[ "$attempt" -lt "$TOMEDO_RSYNC_MAX_RETRIES" ]]; then + log "WARNUNG: rsync ${label} fehlgeschlagen (rc=$rc). Remount und Retry in ${TOMEDO_RSYNC_RETRY_SLEEP}s." + if mountpoint -q "$CIFS_MOUNTPOINT"; then + umount "$CIFS_MOUNTPOINT" 2>/dev/null || umount -l "$CIFS_MOUNTPOINT" || true + fi + sleep "$TOMEDO_RSYNC_RETRY_SLEEP" + mount_cifs + continue + fi + log "FEHLER: rsync ${label} nach ${TOMEDO_RSYNC_MAX_RETRIES} Versuchen fehlgeschlagen (rc=$rc)." + return "$rc" + fi + + log "FEHLER: rsync ${label} fehlgeschlagen (rc=$rc)." + return "$rc" + done + + return "$rc" +} + copy_to_paperless_flat_if_allowed_ext() { local src="$1" local rel="$2" @@ -414,15 +455,16 @@ rsync_tomedo_backup() { fi mkdir -p "$dst_snapshot" "$dst_files" + local tomedo_rsync_opts=(-r -l -t -O --info=progress2 --temp-dir=/tmp) log "== rsync Tomedo Snapshot: $src_snapshot -> $dst_snapshot ==" - rsync -r -l -t -O --info=progress2 \ + run_rsync_with_cifs_retry "Tomedo Snapshot" "${tomedo_rsync_opts[@]}" \ --exclude-from "$TOMEDO_MACOS_EXCLUDES" \ "$src_snapshot" \ "$dst_snapshot" log "== rsync Tomedo Files: $src_files -> $dst_files ==" - rsync -r -l -t -O --info=progress2 \ + run_rsync_with_cifs_retry "Tomedo Files" "${tomedo_rsync_opts[@]}" \ --exclude-from "$TOMEDO_MACOS_EXCLUDES" \ --exclude-from "$TOMEDO_FILES_EXCLUDES" \ "$src_files" \