diff --git a/macos/backup-bfds-storage-offsite/backup-bfds-storage-offsite.sh b/macos/backup-bfds-storage-offsite/backup-bfds-storage-offsite.sh index fc7aa76..d0dd1ce 100755 --- a/macos/backup-bfds-storage-offsite/backup-bfds-storage-offsite.sh +++ b/macos/backup-bfds-storage-offsite/backup-bfds-storage-offsite.sh @@ -13,6 +13,11 @@ PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/homebrew/bin" export PATH +# Schlaf verhindern, solange dieses Script laeuft (-w $$ endet mit dem Script). +# -i Idle-Sleep, -m Platten-Sleep, -s System-Sleep (nur am Netzteil wirksam). +# Der Bildschirm darf ausgehen. +caffeinate -i -m -s -w $$ & + SHARES=( photos rob @@ -115,6 +120,7 @@ fi EXIT_CODE=0 PROBE_TIMEOUT="${PROBE_TIMEOUT:-20}" RSYNC_TIMEOUT="${RSYNC_TIMEOUT:-60}" +RSYNC_RETRIES="${RSYNC_RETRIES:-3}" # Fuehrt einen Befehl mit Zeitlimit (Sekunden) aus; macOS hat kein timeout. # Ein haengender Prozess (z.B. ls auf toter SMB-Verbindung) wird nicht @@ -180,8 +186,19 @@ run_rsync() { # -r Unterverzeichnisse inkl. leerer, -l Symlinks, -t Zeitstempel (wie /COPY:DAT), # --partial setzt abgebrochene Uebertragungen fort (wie /z). Kein --delete: # robocopy /E spiegelt ebenfalls nicht. --timeout bricht bei SMB-Haengern ab. - rsync -rlt -h -v --progress --partial --stats --timeout="$RSYNC_TIMEOUT" --exclude=".DS_Store" --exclude="._.DS_Store" "$source/" "$MOUNT_POINT/$share/" - local rc=$? + # Bei Abbruch (z.B. SMB-Timeout) bis zu RSYNC_RETRIES mal weiter; --partial und + # der Zeitstempelvergleich sorgen dafuer, dass Fertiges nicht neu kopiert wird. + local rc attempt=1 + while :; do + rsync -rlt -h -v --progress --partial --stats --timeout="$RSYNC_TIMEOUT" --exclude=".DS_Store" --exclude="._.DS_Store" "$source/" "$MOUNT_POINT/$share/" + rc=$? + [ "$rc" -eq 0 ] && break + [ "$attempt" -lt "$RSYNC_RETRIES" ] || break + attempt=$((attempt + 1)) + log "rsync fuer $share endete mit Code $rc, neuer Versuch $attempt/$RSYNC_RETRIES in 15s" + sleep 15 + run_with_timeout "$PROBE_TIMEOUT" probe_source "$source" || { log "WARNUNG: $source weiterhin nicht lesbar"; break; } + done if [ "$rc" -ne 0 ]; then log "WARNUNG: rsync fuer $share endete mit Code $rc" EXIT_CODE=1