rsync avec cron job à chaque minute

0

Je transfère des fichiers sur le réseau à l'aide de rsync dans un travail cron qui s'exécute toutes les minutes. La tâche consiste à envoyer un nouveau fichier chaque fois qu'il doit être téléchargé sur le serveur distant:

Depuis que je suis nouveau, je fais une grosse erreur ici:

* * * * * rsync -azP /local_path [email protected]:/remote_path > /dev/null

rsync crée un fichier temporaire (à distance) et à la minute suivante, il crée de nouveau un fichier temporaire (à distance) après quelques minutes, mes réseaux commencent à s'étouffer et il n'y a plus de bande passante pour l'envoi, puis je tue tous les processus rsync et les copie à la fois.

Besoin de cette automatisé s'il vous plaît aider.

Merci

ALi
la source
Déterminez combien de temps prend vraiment le rsync, puis programmez au moins le quadruple de ce temps. Chaque minute en fait trop - votre ordinateur ne fera que rsync.
harrymc

Réponses:

1

On dirait que c'est parce que l'exécution de la commande prend plus d'une minute. Par conséquent, les commandes s'accumulent jusqu'à ce que votre système manque de ressources.

Vous pouvez vous assurer que seule une instance de celle-ci rsyncs'exécute à l'aide d'un fichier de verrouillage. util-linuxinclut un wrapper de verrouillage de fichier appelé flock, que vous pouvez utiliser dans votre crontab comme ceci:

* * * * * /usr/bin/flock -n '/tmp/example.lock' -c 'rsync -azP /local_path [email protected]:/remote_path' > /dev/null

Dans l'exemple ci-dessus, le chemin du fichier de verrouillage est /tmp/example.lock, mais vous pouvez le définir comme étant raisonnable. -nempêchera les flockcommandes de s’empiler car elle se fermera immédiatement au lieu d’attendre que le verrou soit libéré pour continuer.


Alternativement, vous pouvez également empêcher votre commande cron de s’empiler en créant un script avec un verrou assez simple garantissant qu’une seule instance du script puisse être exécutée à la fois:

#!/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"

Mécanisme de verrouillage inspiré par la prévention des exécutions de tâches cron en double par Benjamin Cane

Notez que la principale limitation du script est que si le fichier PID n'est pas supprimé pour une raison quelconque et qu'un autre processus a le même PID, le script se ferme par erreur.

Enregistrez ce script quelque part, comme dans /usr/local/bin/example.sh, chmod +x /usr/local/bin/example.shpuis appelez-le depuis votre crontab comme ceci:

* * * * * /usr/local/bin/example.sh > /dev/null
Deltik
la source
1
Script dangereux. Si la machine est arrêtée de force ou en cas de panne de courant, le fichier PID sauvegardé durera indéfiniment, empêchant ainsi le rsyncdémarrage. En outre, la rmcommande dans ce script doit être exécutée via trappour être sûr que dans le cas par exemple d'un événement de redémarrage ou d'arrêt, le fichier PID serait supprimé. Encouragez également les étudiants à faire au moins une partie de leurs travaux au lieu de leur donner des solutions gratuites
Alex
0

Tout d’abord, supprimez l’ -Poption, cron ne veut vraiment pas voir les progrès.

Vous devez implémenter un mécanisme de verrouillage, n'appelez pas rsyncdirectement à partir de cron, mais créez plutôt un script qui serait utilisé dans cron. Dans le script, vérifiez la première condition si elle est rsyncdéjà en cours d'exécution (sortie grep ps par exemple), si elle est en cours d'exécution, quittez simplement le script, sinon exécutez-la rsync.

Alex
la source