J'utilise rsync pour sauvegarder certaines données d'un serveur à un autre. Tout fonctionne bien, mais cela peut prendre plus de temps selon la quantité de données à transférer.
Existe-t-il un moyen garanti de s'assurer qu'une commande rsync ne démarre pas avant que la précédente ait fini d'utiliser un cronjob?
Par exemple, toutes les heures, j'exécute la commande rsync, mais il est possible que le transfert prenne plus d'une heure, de sorte que la suivante commence avant la fin de la précédente.
Réponses:
Vous pouvez implémenter une sorte de verrouillage. Cela affichera le nombre de processus rsync toujours en cours d'exécution:
Et cela exécutera le rsync uniquement si aucun autre processus rsync n'existe:
L'utilisation
-x
empêchera de faire correspondre accidentellement des noms indésirables (par exemple "fooba rsync hronizator" ou "not_an_ rsync _totally" - cela fonctionne commepgrep -c ^rsync$
)la source
Vous pouvez utiliser la commande flock pour vous aider à le faire, par exemple. Dans ce cas,
flock -n
c'est probablement ce que vous voulez car cela entraînera un échec immédiat de la commande s'il ne peut pas obtenir le verrou, par exemple.la source
/var/run
place.Si vous êtes prêt à envisager d'autres outils, vous pouvez également consulter rdiff-backup . Il utilise librsync pour effectuer des sauvegardes et enregistre un nombre configurable de deltas / incréments. Il se verrouille également afin qu'un seul processus de sauvegarde rdiff puisse s'exécuter à un moment donné.
la source
Voici ce que je ferais. Créez un script wrapper autour de rsync pour créer un fichier de verrouillage.
la source
Ma réponse est un peu la même que ce que Mike a dit.
Dans le script, vous devez mettre quelque chose comme ceci:
Mais il y a une chose très importante que vous devriez faire. et cela pour mettre en place un système de piège.
Donc, avec cela, ce que vous pouvez faire, c'est que même si votre script est tué ou quelqu'un l'a tué, vous pouvez intercepter ce signal et supprimer le fichier de verrouillage, de sorte que vous n'ayez pas de fichier de verrouillage périmé.
Vous pouvez lire comment implémenter cela ici .
Juste une petite chose, vous ne pouvez pas intercepter le signal 9, je veux dire si quelqu'un le fait
kill -9
, vous ne pouvez pas intercepter cela car ce signal interagit directement avec le noyau et il n'y a aucun moyen de l'intercepter.En outre, comme l'a suggéré John, vous devez supprimer le fichier de verrouillage à chaque redémarrage de votre système, juste pour vous assurer qu'il ne reste plus de fichier périmé.
Vous pouvez facilement le faire en plaçant une petite
rm -f <FILE>
commande dans /etc/rc.localla source
Jetez un œil à anacron (cron anachronique) avec le commutateur -s (sérialiser). Sérialiser garantit que la commande ne sera pas appelée à nouveau si la précédente est toujours en cours d'exécution.
la source
Utilisez hatools ( http://www.fatalmind.com/software/hatools/ ) pour verrouiller crs rsync en mode attente.
la source
flock(1)
Je n'ai pas pu faire fonctionner la solution de mgabriel sur OSX car la version OSX de pgrep ne semble pas avoir l'option -c (je suppose que c'est pour le compte). Au lieu de cela, j'ai utilisé ce qui suit:
J'ai utilisé ping comme exemple de commande.
J'espère que cela t'aides.
la source