Estoy usando rsync para hacer una copia de seguridad de algunos datos de un servidor a otro. Todo funciona bien, pero puede tardar más en terminar dependiendo de la cantidad de datos que hay que transferir.
¿Hay alguna forma garantizada de garantizar que un comando rsync no se inicie antes de que el anterior termine de usar un cronjob?
Por ejemplo, cada hora ejecuto el comando rsync, pero es posible que la transferencia tarde más de 1 hora en completarse, por lo que la siguiente comenzará antes de que finalice la anterior.
Respuestas:
Puede implementar algún tipo de bloqueo. Esto imprimirá la cantidad de procesos rsync que aún se ejecutan:
Y esto ejecutará rsync solo si no existe otro proceso rsync:
El uso
-x
evitará la coincidencia accidental de nombres no deseados (por ejemplo, "fooba rsync hronizator" o "not_an_ rsync _totally", funciona igual quepgrep -c ^rsync$
)fuente
Puede usar el comando flock para ayudarlo a hacer esto, por ejemplo, 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 ejemplofuente
/var/run
lugar.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 un número configurable de deltas / incrementos. También se bloquea para que solo un proceso de rdiff-backup pueda ejecutarse en un momento dado.
fuente
Esto es lo que haría. Cree un script de envoltura alrededor de rsync para crear un archivo de bloqueo.
fuente
Mi respuesta es algo similar a lo que Mike dijo.
En el script, deberías poner algo como esto:
Pero hay una cosa muy importante que deberías estar haciendo. y eso para implementar un sistema de trampa.
Entonces, con eso, lo que puedes hacer es que, incluso si de alguna manera tu script es eliminado o alguien lo eliminó, entonces puedes atrapar esa señal y eliminar el archivo de bloqueo, para que no tengas 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 que si alguien lo hace
kill -9
, no puedes atrapar eso ya que esa señal interactúa directamente con el núcleo y no hay forma de atrapar eso.Además, como lo sugiere 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 puede hacerlo fácilmente poniendo un pequeño
rm -f <FILE>
comando en /etc/rc.localfuente
Eche un vistazo a anacron (cron anacrónico) con el modificador -s (serializar). Serialize garantiza que no se volverá a llamar al comando si el anterior todavía se está ejecutando.
fuente
Use hatools ( http://www.fatalmind.com/software/hatools/ ) para bloquear rsync cron en modo de espera.
fuente
flock(1)
No pude obtener la solución de mgabriel para trabajar en OSX ya que la versión OSX de pgrep no parece tener la opción -c (supongo que esto es para contar). En su lugar, utilicé lo siguiente:
Usé ping como un comando de ejemplo.
Espero que esto ayude.
fuente