rsync mit cron job jede minutenausgabe

554
ALi

Ich übertrage Dateien über das Netzwerk mit rsync in cron job, der alle 1 Minute ausgeführt wird. Die Aufgabe besteht darin, wann immer neue Dateien auf Remote-Server hochgeladen werden müssen:

Da ich neu bin, mache ich hier einen großen Fehler:

* * * * * rsync -azP /local_path user@x.x.x.x:/remote_path > /dev/null 

rsync temporäre Datei erstellen (am Remote-Ende) und in der nächsten Minute erneut (am Remote-Ende) temporäre Datei erstellt. Nach einigen Minuten werden in meinem Netzwerk Choke und keine Upload-Bandbreite übrig. Dann bringe ich alle Rsync-Prozesse zu einem Zeitpunkt auf und kopiere sie.

Brauche das bitte automatisiert bitte.

Vielen Dank

0
Finden Sie heraus, wie lange der Rsync wirklich dauert, und legen Sie dann mindestens das Vierfache dieser Zeit fest. Jede Minute übertreibt es - Ihr Computer tut nichts anderes als Rsync. harrymc vor 6 Jahren 0

2 Antworten auf die Frage

1
Deltik

Sieht so aus, weil der Befehl länger als eine Minute dauert, sodass sich die Befehle so lange anhäufen, bis Ihr System keine Ressourcen mehr hat.

Sie können sicherstellen, dass nur eine Instanz davon ausgeführt wird, rsyncindem Sie eine Sperrdatei verwenden. util-linuxenthält einen Wrapper für Dateisperren flock, den Sie wie folgt in Ihrer Crontab verwenden können:

* * * * * /usr/bin/flock -n '/tmp/example.lock' -c 'rsync -azP /local_path user@x.x.x.x:/remote_path' > /dev/null 

Im obigen Beispiel lautet der Sperrdateipfad /tmp/example.lock, Sie können ihn jedoch als alles vernünftig festlegen. -nverhindert das flockAnhäufen von Befehlen, da sie sofort beendet wird, anstatt zu warten, bis die Sperre freigegeben wird.


Alternativ können Sie auch verhindern, dass sich Ihr Cron-Befehl anhäuft, indem Sie ein Skript mit einer recht einfachen Sperre erstellen, die sicherstellt, dass jeweils nur eine Instanz des Skripts ausgeführt werden kann:

#!/bin/bash  PIDFILE=/tmp/example.pid  if [ -f "$PIDFILE" ] then PID="$(cat "$PIDFILE")" ps -p $PID > /dev/zero 2>&1 if [ $? -eq 0 ] then echo "Instance of this script is still running as PID $PID" exit 1 fi fi  echo $$ > $PIDFILE if [ $? -ne 0 ] then echo "Could not create PID file: $PIDFILE" exit 1 fi  # YOUR CODE GOES BELOW rsync -az /local_path user@x.x.x.x:/remote_path # YOUR CODE GOES ABOVE  rm -f "$PIDFILE" 

Sperrmechanismus inspiriert durch Verhindern doppelter Cron-Job-Ausführungen von Benjamin Cane

Beachten Sie, dass die Haupteinschränkung im Skript darin liegt, dass die PID-Datei aus irgendeinem Grund nicht entfernt wird und ein anderer Prozess dieselbe PID hat. Das Skript wird fälschlicherweise beendet.

Speichern Sie dieses Skript irgendwo wie in /usr/local/bin/example.sh, chmod +x /usr/local/bin/example.shund rufen Sie es dann von Ihrer Crontab wie folgt auf:

* * * * * /usr/local/bin/example.sh > /dev/null 
Gefährliches Skript. Wenn die Maschine gewaltsam gestoppt wurde oder der Strom ausfällt, bleibt die gespeicherte PID-Datei für immer erhalten, was den Start von 'rsync' verhindert. Außerdem muss der Befehl 'rm' in einem solchen Skript über 'trap' ausgeführt werden, um sicherzustellen, dass die PID-Datei für den Fall eines Neustarts oder eines Herunterfahrereignisses entfernt wird. Ermutigen Sie die Schüler auch, zumindest einen Teil ihrer Werke zu machen, anstatt ihnen freie Lösungen zu geben Alex vor 6 Jahren 1
0
Alex

Zuerst entfernen Sie die -POption, cron kann den Fortschritt wirklich nicht sehen.

Sie müssen einen Sperrmechanismus implementieren, rufen Sie nicht rsyncdirekt von cron aus an, sondern erstellen Sie ein Skript, das in cron verwendet wird. Überprüfen Sie im Skript die erste Bedingung, wenn sie rsyncbereits ausgeführt wird (z. B. Ausgabe von grep ps). Wenn sie ausgeführt wird, beenden Sie das Skript, oder führen Sie es aus rsync.