Ich mache etwas Ähnliches mit rsync
Backups [auf Festplatte] und habe das gleiche Problem festgestellt, weil ein Daemon Dateien aktualisiert, während das Backup ausgeführt wird.
Im Gegensatz zu vielen anderen Programmen weist rsync viele verschiedene Fehlercodes auf [siehe Manpage unten]. Von Interesse sind zwei:
23 - Teilübertragung aufgrund eines Fehlers
24 - Teilübertragung aufgrund verschwundener Quelldateien
Wenn rsync eine Übertragung durchführt und auf eine dieser Situationen stößt, wird es nicht sofort gestoppt. Es überspringt und fährt mit den Dateien fort, die es übertragen kann . Am Ende wird der Rückkehrcode angezeigt.
Wenn Sie also den Fehler 23/24 erhalten, führen Sie einfach den rsync erneut aus. Die nachfolgenden Läufe gehen viel schneller und übertragen normalerweise nur die fehlenden Dateien aus dem vorherigen Lauf. Schließlich erhalten Sie einen sauberen Lauf.
Um atomar zu sein, verwende ich während der Übertragung ein "tmp" -Dir. Wenn dann rsync run sauber ist, benenne ich es [atomar] in um<date>
Ich benutze auch die --link-dest
Option, aber ich benutze sie, um Delta-Backups zu erstellen (z. B. --link-dest=yesterday
täglich).
Obwohl ich es selbst nicht verwendet habe, --partial-dir=DIR
kann es sein, dass die versteckten Dateien das Sicherungsverzeichnis nicht überladen. Stellen Sie sicher, dass sich DIR im selben Dateisystem wie Ihr Sicherungsverzeichnis befindet, damit die Umbenennung atomar ist
Während ich dies in Perl mache, habe ich ein Skript geschrieben, das das, was ich gesagt habe, mit etwas mehr Details / Präzision für Ihre spezielle Situation zusammenfasst. Es ist in tcsh-ähnliche Syntax, [ungetestet und ein wenig rau], aber es als Pseudo-Code behandeln Ihre eigenen zu schreiben bash
, perl
, python
Skript , wie Sie wählen. Beachten Sie, dass es keine Begrenzung für Wiederholungsversuche gibt, aber Sie können dies ganz einfach nach Ihren Wünschen hinzufügen.
#!/bin/tcsh -f
# repo_backup -- backup repos even if they change
#
# use_tmp -- use temporary destination directory
# use_partial -- use partial directory
# use_delta -- make delta backup
# set remote server name ...
set remote_server="..."
# directory on server for backups
set backup_top="/path_to_backup_top"
set backup_backups="$backup_top/backups"
# set your rsync options ...
set rsync_opts=(...)
# keep partial files from cluttering backup
set server_partial=${remote_server}:$backup_top/partial
if ($use_partial) then
set rsync_opts=($rsync_opts --partial-dir=$server_partial)
endif
# do delta backups
if ($use_delta) then
set latest=(`ssh ${remote_server} ls $backup_backups | tail -1`)
# get latest
set delta_dir="$backup_backups/$latest"
if ($#latest > 0) then
set rsync_opts=($rsync_opts --link-dest=${remote_server}:$delta_dir)
endif
endif
while (1)
# get list of everything to backup
# set this to whatever you need
cd /local_top_directory
set transfer_list=(.)
# use whatever format you'd like
set date=`date +%Y%m%d_%H%M%S`
set server_tmp=${remote_server}:$backup_top/tmp
set server_final=${remote_server}:$backup_backups/$date
if ($use_tmp) then
set server_transfer=$server_tmp
else
set server_transfer=$server_final
endif
# do the transfer
rsync $rsync_opts $transfer_list $server_transfer
set code=$status
# run was clean
if ($code == 0) then
# atomically install backup
if ($use_tmp) then
ssh ${remote_server} mv $backup_top/tmp $backup_backups/$date
endif
break
endif
# partial -- some error
if ($code == 23) then
continue
endif
# partial -- some files disappeared
if ($code == 24) then
continue
endif
echo "fatal error ..."
exit(1)
end
'"'
inset backup_backups=$backup_top/backups"