Ich verwende rsync, um einige Daten von einem Server auf einen anderen zu sichern. Alles funktioniert einwandfrei, aber es kann länger dauern, bis der Vorgang abgeschlossen ist, je nachdem, wie viele Daten übertragen werden müssen.
Gibt es eine garantierte Möglichkeit, um sicherzustellen, dass ein rsync-Befehl nicht gestartet wird, bevor der vorherige einen Cronjob beendet hat?
Zum Beispiel führe ich jede Stunde den Befehl rsync aus, aber es ist möglich, dass die Übertragung mehr als 1 Stunde dauert, sodass die nächste beginnt, bevor die vorherige beendet wird.
Antworten:
Sie können eine Art Sperre implementieren. Dadurch wird die Anzahl der noch laufenden rsync-Prozesse gedruckt:
Dadurch wird rsync nur ausgeführt, wenn kein anderer rsync-Prozess vorhanden ist:
Durch
-x
die Verwendung wird verhindert, dass versehentlich unerwünschte Namen gefunden werden (z. B. "fooba rsync hronizator" oder "not_an_ rsync _totally" - es funktioniert genau sopgrep -c ^rsync$
).quelle
Sie können den Befehl flock verwenden , um dies zu tun, z. B. In diesem Fall
flock -n
ist es wahrscheinlich das, was Sie möchten, da dies einen sofortigen Fehler des Befehls verursacht, wenn er die Sperre nicht erhalten kann, zquelle
/var/run
ablegen.Wenn Sie bereit sind, andere Tools in Betracht zu ziehen, können Sie sich auch rdiff-backup ansehen . Es verwendet Librsync, um Sicherungen durchzuführen, und speichert eine konfigurierbare Anzahl von Deltas / Inkrementen. Es wird auch gesperrt, sodass jeweils nur ein rdiff-Backup-Prozess ausgeführt werden kann.
quelle
Hier ist was ich tun würde. Erstellen Sie ein Wrapper-Skript um rsync, um eine Sperrdatei zu erstellen.
quelle
Meine Antwort ist ungefähr die gleiche, die Mike gesagt hat.
In das Skript sollten Sie Folgendes einfügen:
Aber es gibt eine sehr wichtige Sache, die Sie tun sollten. und das, um ein Fallensystem zu implementieren.
Damit können Sie also selbst dann, wenn Ihr Skript irgendwie getötet wird oder jemand es getötet hat, dieses Signal abfangen und die Sperrdatei entfernen, sodass Sie keine veraltete Sperrdatei haben.
Wie Sie das umsetzen können, lesen Sie hier .
Nur eine kleine Sache, Sie können Signal 9 nicht abfangen. Ich meine, wenn jemand dies tut
kill -9
, können Sie das nicht abfangen, da dieses Signal direkt mit dem Kernel interagiert und es keine Möglichkeit gibt, das abzufangen.Wie von John vorgeschlagen, müssen Sie die Sperrdatei bei jedem Neustart des Systems entfernen, um sicherzustellen, dass keine veraltete Datei mehr vorhanden ist.
rm -f <FILE>
Dies können Sie einfach tun, indem Sie einen kleinen Befehl in /etc/rc.local eingebenquelle
Schauen Sie sich anacron (anachronistic cron) mit dem Schalter -s (serialize) an. Durch Serialize wird sichergestellt, dass der Befehl nicht erneut aufgerufen wird, wenn der vorherige noch ausgeführt wird.
quelle
Verwenden Sie hatools ( http://www.fatalmind.com/software/hatools/ ), um rsync cron im Wartemodus zu sperren.
quelle
flock(1)
Ich konnte die Lösung von mgabriel unter OSX nicht zum Laufen bringen, da die OSX-Version von pgrep anscheinend nicht die Option -c enthält (ich gehe davon aus, dass dies für die Zählung gilt). Stattdessen habe ich Folgendes verwendet:
Ich habe Ping als Beispielbefehl verwendet.
Hoffe das hilft.
quelle