Soluzione 1:
Puoi implementare un qualche tipo di blocco. Questo stamperà il numero di processi rsync ancora in esecuzione:
pgrep -cx rsync
E questo eseguirà rsync solo se non esiste nessun altro processo rsync:
pgrep -cx rsync || rsync ...
Utilizzando -x
impedirà la corrispondenza accidentale di nomi indesiderati (ad esempio "foobarsync hronizator" o "not_an_rsync _totally" - funziona proprio come pgrep -c ^rsync$
)
Soluzione 2:
Puoi usare il comando flock per aiutarti a farlo, ad es. In questo caso flock -n
è probabilmente quello che vuoi in quanto causerà un immediato fallimento del comando se non può ottenere il blocco, ad es.
30 * * * * /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript
Soluzione 3:
Ecco cosa farei. Crea uno script wrapper attorno a rsync per creare un file di blocco.
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
Soluzione 4:
Se sei disposto a prendere in considerazione altri strumenti, potresti anche dare un'occhiata a rdiff-backup. Utilizza librsync per eseguire i backup e salva un numero configurabile di delta/incrementi. Inoltre si blocca in modo che possa essere eseguito solo un processo rdiff-backup alla volta.
Soluzione 5:
La mia risposta è in qualche modo la stessa che ha detto Mike.
Nello script, dovresti inserire qualcosa del genere:
- crea un file di blocco
- Controlla l'esistenza del file di blocco quando lo esegui la prossima volta.
Ma c'è una cosa molto importante che dovresti fare. e quello per implementare un sistema di trappole.
Quindi, con questo, quello che puoi fare è che anche se in qualche modo il tuo script viene ucciso o qualcuno lo ha ucciso, allora puoi intercettare quel segnale e rimuovere il file di blocco, in modo da non avere un file di blocco obsoleto.
Puoi leggere come implementarlo qui.
Solo una piccola cosa, non puoi intercettare il segnale 9, voglio dire se qualcuno fa kill -9
, non puoi intercettarlo poiché quel segnale interagisce direttamente con il kernel e non c'è modo di intercettarlo.
Inoltre, come suggerito da John, devi rimuovere il file di blocco ogni volta che il sistema si riavvia, solo per assicurarti che non rimangano file obsoleti.
Puoi farlo facilmente inserendo un piccolo rm -f <FILE>
comando in /etc/rc.local