
Ich habe einen Cron-Job, der einen Rsync-Befehl ausführt, der alle zwei Stunden ein Remote-Backup durchführt.
Für den Fall, dass das vorherige Remote-Backup noch läuft, habe ich diesen Rysnc-Befehl in einen Flock-Befehl gekapselt.
Flock verhindert, dass dieser Befehl mehrmals gleichzeitig ausgeführt wird:
flock -n /location/of/lock_file -c 'rsync -rv /home/localuser/ [email protected]:/home/remoteuser/backupFolder' || echo "Couldn't perform remote backup, because previous remote backup is still in progress."
Wenn ich jedoch während eines dieser Backups den Remote-Server neu starte (um ein Szenario mit unterbrochener Verbindung zu simulieren), blockiert Flock weiterhin zukünftige Versuche, da der vorherige Prozess (obwohl dauerhaft vom Backup-Ziel getrennt) weiterhin besteht.
Was ist die beste Möglichkeit, Flock darüber zu informieren, dass rsync auf unbestimmte Zeit fehlgeschlagen ist, und daher diese Sperren aufzuheben, die zukünftige Versuche verhindern?
Auf der Manpage von rsync sehe ich, dass es ein Argument --timeout gibt. Ist das Festlegen dieses Arguments die beste Möglichkeit, mit den Rund-um-die-Uhr-Sperren von Flock umzugehen?
Antwort1
Dies beantwortet Ihre Frage zwar nicht, flock
könnte aber trotzdem hilfreich sein. Vor einiger Zeit gab es eine ähnliche Frage zu Backup-Strategien und mir gefielmeine Antwortgenug, um es selbst umzusetzen.
Die Grundidee besteht darin, dass Ihr Backup-Skript nach Abschluss eine Datei am Backup-Ziel erstellt und diese Datei löscht, sobald es ausgeführt wird. Anschließend testen Sie mit Ihrem Skript, ob die Datei vorhanden ist, und lassen es nur ausführen, wenn die Datei vorhanden ist:
#!/usr/bin/env bash
## Make sure no backup is currently running
if [ ! -e /path/to/backup/backup_finished.txt ]; then
echo "A backup seems to be running, or did not finish correctly, exiting." &&
exit;
fi
## Delete the file from the remote server
ssh user@remote rm /path/to/backup/backup_finished.txt
## Do da rsync
rsync /path/to/source/ user@remote:/path/to/daily/backup/
## Create the file on the remote server
ssh user@remote touch /path/to/backup/backup_finished.txt
Dies ist ein viel einfacherer Ansatz als Ihrer, hat aber den Vorteil, dass ich nicht abgeschlossene Backups abfangen kann (obwohl ich nicht auf elegante Weise damit umgehen kann). Sie können dies erweitern, um zu testen, ob ein Backup tatsächlich ausgeführt wird oder ob ein altes nicht sauber beendet wurde, und entsprechend reagieren.
Da Sie Prozesse sowohl auf dem lokalen als auch auf dem Remotecomputer überwachen müssen, glaube ich nicht, dass ein System mit Sperrdateien funktionieren wird.