Compare commits
2
Commits
6fe87107ce
...
f035a3dc0c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f035a3dc0c | ||
|
|
3e1c561559 |
@@ -13,6 +13,11 @@
|
|||||||
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/homebrew/bin"
|
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/homebrew/bin"
|
||||||
export PATH
|
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=(
|
SHARES=(
|
||||||
photos
|
photos
|
||||||
rob
|
rob
|
||||||
@@ -113,6 +118,38 @@ fi
|
|||||||
# Kopieren der SMB-Freigaben
|
# Kopieren der SMB-Freigaben
|
||||||
# **************************************************
|
# **************************************************
|
||||||
EXIT_CODE=0
|
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
|
||||||
|
# abgewartet, sondern abgeschossen und zurueckgelassen.
|
||||||
|
run_with_timeout() {
|
||||||
|
local secs="$1" pid ticks=0
|
||||||
|
shift
|
||||||
|
"$@" >/dev/null 2>&1 &
|
||||||
|
pid=$!
|
||||||
|
while kill -0 "$pid" 2>/dev/null; do
|
||||||
|
if [ "$ticks" -ge $((secs * 10)) ]; then
|
||||||
|
kill -9 "$pid" 2>/dev/null
|
||||||
|
return 124
|
||||||
|
fi
|
||||||
|
sleep 0.1
|
||||||
|
ticks=$((ticks + 1))
|
||||||
|
done
|
||||||
|
wait "$pid"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Prueft, ob die Freigabe wirklich gemountet ist, Verzeichnisse listbar sind
|
||||||
|
# und sich Dateiinhalt lesen laesst (Listing allein kann aus dem Cache kommen).
|
||||||
|
probe_source() {
|
||||||
|
local dir="$1" file
|
||||||
|
mount | grep -q " on $dir (smbfs" || return 1
|
||||||
|
ls -A "$dir" >/dev/null || return 1
|
||||||
|
file="$(find "$dir" -maxdepth 3 -type f ! -name '.*' -print -quit)" || return 1
|
||||||
|
[ -z "$file" ] || head -c 1 "$file" >/dev/null || return 1
|
||||||
|
}
|
||||||
|
|
||||||
run_rsync() {
|
run_rsync() {
|
||||||
local share="$1"
|
local share="$1"
|
||||||
@@ -138,12 +175,30 @@ run_rsync() {
|
|||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
log "Pruefe Lesbarkeit von $source (Timeout ${PROBE_TIMEOUT}s)"
|
||||||
|
if ! run_with_timeout "$PROBE_TIMEOUT" probe_source "$source"; then
|
||||||
|
log "WARNUNG: $source nicht lesbar (haengt oder Fehler), ueberspringe $share. Freigabe im Finder trennen und neu verbinden."
|
||||||
|
EXIT_CODE=1
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
log "Sichere $share"
|
log "Sichere $share"
|
||||||
# -r Unterverzeichnisse inkl. leerer, -l Symlinks, -t Zeitstempel (wie /COPY:DAT),
|
# -r Unterverzeichnisse inkl. leerer, -l Symlinks, -t Zeitstempel (wie /COPY:DAT),
|
||||||
# --partial setzt abgebrochene Uebertragungen fort (wie /z). Kein --delete:
|
# --partial setzt abgebrochene Uebertragungen fort (wie /z). Kein --delete:
|
||||||
# robocopy /E spiegelt ebenfalls nicht.
|
# robocopy /E spiegelt ebenfalls nicht. --timeout bricht bei SMB-Haengern ab.
|
||||||
rsync -rlt -h -v --progress --partial --stats --exclude=".DS_Store" --exclude="._.DS_Store" "$source/" "$MOUNT_POINT/$share/"
|
# Bei Abbruch (z.B. SMB-Timeout) bis zu RSYNC_RETRIES mal weiter; --partial und
|
||||||
local rc=$?
|
# 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
|
if [ "$rc" -ne 0 ]; then
|
||||||
log "WARNUNG: rsync fuer $share endete mit Code $rc"
|
log "WARNUNG: rsync fuer $share endete mit Code $rc"
|
||||||
EXIT_CODE=1
|
EXIT_CODE=1
|
||||||
|
|||||||
Reference in new issue
Block a user