Solution 1 :
Vous pouvez implémenter une sorte de verrouillage. Cela imprimera le nombre de processus rsync toujours en cours :
pgrep -cx rsync
Et cela n'exécutera le rsync que si aucun autre processus rsync n'existe :
pgrep -cx rsync || rsync ...
Utilisation de -x
empêchera de faire correspondre accidentellement des noms indésirables (par exemple "foobarsync hronizator" ou "not_an_rsync _totalement" - cela fonctionne exactement comme pgrep -c ^rsync$
)
Solution 2 :
Vous pouvez utiliser la commande flock pour vous aider à le faire, par exemple. Dans ce cas flock -n
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
30 * * * * /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript
Solution 3 :
Voici ce que je ferais. Créez un script wrapper autour du rsync pour créer un fichier de verrouillage.
script 1
- create lock file
- rsync
- remove lock file
script 2 (running later then script 1)
- check if lock file is there
- if not run
- if it is there wait 10 minutes in a loop. break out of lopp when the lock file is gone
- continue to run script
Solution 4 :
Si vous êtes prêt à envisager d'autres outils, vous pouvez également jeter un œil à 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 rdiff-backup puisse s'exécuter à la fois.
Solution 5 :
Ma réponse est un peu la même que celle de Mike.
Dans le script, vous devriez mettre quelque chose comme ceci :
- créer un fichier de verrouillage
- Vérifiez l'existence du fichier de verrouillage lors de sa prochaine exécution.
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 d'une manière ou d'une autre votre script est tué ou que quelqu'un l'a tué, vous pouvez piéger ce signal et supprimer le fichier de verrouillage, de sorte que vous n'ayez pas de fichier de verrouillage obsolète.
Vous pouvez lire comment mettre en œuvre cela ici.
Juste une petite chose, vous ne pouvez pas piéger le signal 9, je veux dire si quelqu'un le fait kill -9
, vous ne pouvez pas piéger cela car ce signal interagit directement avec le noyau et il n'y a aucun moyen de piéger cela.
De plus, comme suggéré par John, vous devez supprimer le fichier de verrouillage à chaque redémarrage de votre système, juste pour vous assurer qu'il ne reste aucun fichier obsolète.
Ce que vous pouvez facilement faire en mettant un petit rm -f <FILE>
commande dans /etc/rc.local