6 votes

Cron et rsync utilisant le verrouillage des fichiers mais existe-t-il une meilleure méthode sur Mac OS X Server ?

J'ai ce bash script et il est exécuté via cron à intervalle régulier :

#!/bin/bash

RSYNC=/usr/bin/rsync
SSH=/usr/bin/ssh
KEY=/Users/admin/Documents/Backup/rsync-key
RUSER=philosophy
RHOST=example.com
RPATH=data/
LPATH="/Volumes/G Technology G Speed eS/Backup"
LOCKFILE=/Users/admin/Documents/backup.isrunning

if [ ! -e $LOCKFILE ]; then
    touch $LOCKFILE
    $RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH
    rm $LOCKFILE
else
    echo "Rsync - Backup still running"
fi

La sauvegarde peut prendre n'importe quel temps, de quelques minutes à plusieurs jours, et si j'exécute la sauvegarde via cron toutes les 6 heures, je ne veux pas que deux instances de ce système fonctionnent en même temps. J'ai donc créé un mécanisme de verrouillage simple. Mais je m'inquiète du fait que si le script est tué à mi-chemin pour une raison quelconque, le fichier de verrouillage sera toujours là et la routine de sauvegarde ne sera pas exécutée.

Y a-t-il un moyen d'améliorer ce système pour qu'il soit plus sûr ?

Gracias

Scott

EDIT : Bash final script que j'utilise maintenant grâce à la réponse ci-dessous :

#!/bin/bash

RSYNC=/usr/bin/rsync
SSH=/usr/bin/ssh
KEY=/Users/admin/Documents/Backup/rsync-key
RUSER=philosophy
RHOST=example.com
RPATH=data/
LOCKFILE=/Users/admin/Documents/Backup/backup.isrunning

if [ ! -e $LOCKFILE ]
then
    echo $$ >"$LOCKFILE"
else
    PID=$(cat "$LOCKFILE")
    if kill -0 "$PID" >&/dev/null
    then
        echo "Rsync - Backup still running"
        exit 0
    else
        echo $$ >"$LOCKFILE"
        echo "Warning: previous backup appears to have not finished correctly"
    fi
fi

LPATH="/Volumes/G Technology G Speed eS/Backup"
$RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH

LPATH="/Volumes/G Technology G Speed eS/Catalogue"
$RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH

LPATH="/Volumes/G Technology G Speed eS/Digital"
$RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH

LPATH="/Volumes/G Technology G Speed eS/Finance"
$RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH

LPATH="/Volumes/G Technology G Speed eS/Image Libraries"
$RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH

LPATH="/Volumes/G Technology G Speed eS/IT Desk"
$RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH

LPATH="/Volumes/G Technology G Speed eS/Office"
$RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH

LPATH="/Volumes/G Technology G Speed eS/Studio"
$RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH

LPATH="/Volumes/G Technology G Speed eS/Toffee Apple"
$RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH

rm -f "$LOCKFILE"

4voto

user9517 Points 113163

Si vous mettez le PID du script dans le fichier de verrouillage alors, si le fichier de verrouillage existe quand une nouvelle instance démarre, vous pouvez lire le PID et vérifier si le script est toujours en cours d'exécution. Si le script n'est pas en cours d'exécution, alors nettoyez, mettez le PID de l'instance actuelle dans le fichier de verrouillage et lancez la rsync, sinon imprimez un message 'still running' et quittez.

EDIT :

#!/bin/bash
backup() {
    RSYNC=/usr/bin/rsync
    SSH=/usr/bin/ssh
    KEY=/Users/admin/Documents/Backup/rsync-key
    RUSER=philosophy
    RHOST=example.com
    RPATH=data/
    LPATH="/Volumes/G Technology G Speed eS/Backup"

    $RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH
}

LOCKFILE=/Users/admin/Documents/backup.isrunning

if [ ! -e "$LOCKFILE" ]
then
    echo $$ >"$LOCKFILE"
    backup
else
    PID=$(cat "$LOCKFILE")
    if kill -0 "$PID" >&/dev/null
    then
        echo "Rsync - Backup still running"
        exit 0
    else
        echo $$ >"$LOCKFILE"
        echo "Warning: previous backup appears not to have finished correctly"
        backup
    fi
fi

rm -f "$LOCKFILE"

1voto

Olathe Points 155

Si vous configurez des sauvegardes multiples, vous pouvez consulter le site suivant LBackup qui offre un verrouillage et prend également en charge les sauvegardes par traction. De plus amples informations concernant les avantages d'une sauvegarde en mode pull sont disponibles à l'adresse suivante : http://www.lbackup.org/network_backup_strategies

Si vous consultez le code source de LBackup, vous verrez comment le système de verrouillage est implémenté en utilisant un piège. La suggestion ci-dessus concernant l'utilisation d'un PID est également une bonne idée. Avec cette approche, si le serveur entier se plante et que le piège n'a pas la chance d'être activé.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X