Solución 1:
Puede implementar algún tipo de bloqueo. Esto imprimirá la cantidad de procesos rsync que aún se están ejecutando:
pgrep -cx rsync
Y esto ejecutará el rsync solo si no existe otro proceso de rsync:
pgrep -cx rsync || rsync ...
Usando -x
evitará coincidencias accidentales de nombres no deseados (por ejemplo, "foobarsync hronizator" o "not_an_rsync _totally" - funciona igual que pgrep -c ^rsync$
)
Solución 2:
Puede usar el comando flock para ayudarlo a hacer esto, p. En este caso flock -n
es probablemente lo que desea, ya que provocará una falla inmediata del comando si no puede obtener el bloqueo, por ejemplo,
30 * * * * /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript
Solución 3:
Esto es lo que haría. Cree un script contenedor alrededor de rsync para crear un archivo de bloqueo.
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
Solución 4:
Si está dispuesto a considerar otras herramientas, también puede echar un vistazo a rdiff-backup. Utiliza librsync para hacer copias de seguridad y guarda una cantidad configurable de deltas/incrementos. También se bloquea para que solo se pueda ejecutar un proceso de copia de seguridad de rdiff en un momento dado.
Solución 5:
Mi respuesta es algo similar a lo que dijo Mike.
En el script, deberías poner algo como esto:
- crear un archivo de bloqueo
- Compruebe la existencia del archivo de bloqueo cuando lo ejecute la próxima vez.
Pero hay una cosa muy importante que deberías estar haciendo. y eso de implementar un sistema de trampas.
Entonces, con eso, lo que puede hacer es que incluso si su secuencia de comandos se elimina de alguna manera o alguien la elimina, entonces puede atrapar esa señal y eliminar el archivo de bloqueo, para que no tenga un archivo de bloqueo obsoleto.
Puedes leer cómo implementar eso aquí.
Solo una pequeña cosa, no puedes atrapar la señal 9, quiero decir, si alguien hace kill -9
, no puede atrapar eso ya que esa señal interactúa directamente con el núcleo y no hay forma de atrapar eso.
Además, como sugirió John, debe eliminar el archivo de bloqueo cada vez que se reinicia el sistema, solo para asegurarse de que no quede ningún archivo obsoleto.
Eso lo puedes hacer fácilmente poniendo un pequeño rm -f <FILE>
comando en /etc/rc.local