Rsync mit Cron Job jede Minute Ausgabe


0

Ich übertrage Dateien über das Netzwerk mit rsync im Cron-Job, der alle 1 Minute ausgeführt wird. Die Aufgabe ist, wann immer neue Dateien auf den 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 wird die temporäre Datei erneut erstellt (am Remote-Ende). Nach einigen Minuten wird in meinem Netzwerk eine Drosselung festgestellt, und es ist keine Upload-Bandbreite mehr vorhanden. Dann bringe ich alle rsync-Prozesse zum Stillstand und kopiere gleichzeitig.

Benötigen Sie diese automatisierte bitte helfen.

Vielen Dank


Finden Sie heraus, wie lange der rsync wirklich dauert, und planen Sie dann mindestens das Vierfache dieser Zeit ein. Jede Minute übertreibt es - Ihr Computer wird nichts anderes als Rsync tun.
Harrymc

Antworten:


1

Es sieht so aus, als ob die Ausführung des Befehls länger als eine Minute dauert. Die Befehle häufen sich also, bis auf Ihrem System die Ressourcen ausgehen.

Sie können sicherstellen, dass nur eine Instanz davon ausgeführt wird, rsyncindem Sie eine Sperrdatei verwenden. util-linuxBeinhaltet einen Dateisperr-Wrapper namens flock, den Sie in Ihrer Crontab folgendermaßen 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 Pfad der Sperrdatei /tmp/example.lock, Sie können ihn jedoch auf einen beliebigen sinnvollen Pfad festlegen. -nverhindert, dass sich flockBefehle häufen, da sie sofort beendet werden, anstatt darauf zu warten, dass die Sperre aufgehoben wird, um fortzufahren.


Alternativ können Sie auch verhindern, dass sich Ihr Cron-Befehl aufhäuft, indem Sie ein Skript mit einer relativ einfachen Sperre erstellen, die sicherstellt, dass immer 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 von doppelten Cron-Job-Ausführungen von Benjamin Cane

Beachten Sie, dass das Skript fälschlicherweise beendet wird, wenn die PID-Datei aus irgendeinem Grund nicht entfernt wird und ein anderer Prozess dieselbe PID hat.

Speichern Sie dieses Skript irgendwo, wie in /usr/local/bin/example.sh, chmod +x /usr/local/bin/example.shund nennen es dann von Ihrem crontab wie folgt aus :

* * * * * /usr/local/bin/example.sh > /dev/null

1
Gefährliche Schrift. Wenn die Maschine gewaltsam gestoppt wird oder ein Stromausfall auftritt, wird die gespeicherte PID-Datei für immer erhalten bleiben und den rsyncStart verhindern . Außerdem muss der rmBefehl in einem solchen Skript über ausgeführt werden trap, um sicherzustellen, dass für den Fall, dass beispielsweise ein Neustart oder ein Herunterfahren erfolgt, die PID-Datei entfernt wird. Ermutigen Sie die Schüler auch, zumindest einen Teil ihrer Arbeiten zu erledigen, anstatt ihnen kostenlose Lösungen zu geben
Alex,

0

Zuallererst entferne -POption, cron wird wirklich keinen Fortschritt sehen.

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.