Tenemos compilaciones más largas que generalmente programamos nuestros trabajos cron, pero en ocasiones tenemos que volver a ejecutar una compilación durante un período de tiempo no estándar y podemos encontrar conflictos con trabajos cron que generalmente son seguros para ejecutarse en esos momentos.
Tenemos varias cuentas que ejecutan compilaciones y trabajos cron, por lo que no podemos suspender el servicio crontab para toda la máquina y luego reiniciarlo más tarde.
Me preguntaba si alguien tenía un patrón o implementación. Me imagino que esto funciona como
El usuario crea un archivo: ~ / block-crontab el
usuario ejecuta build El trabajo cron busca ese archivo en el directorio de inicio del usuario y, si está allí, simplemente omite todos los trabajos cron. De lo contrario, ejecuta los trabajos. Luego, cuando finaliza la compilación, el usuario elimina ~ / block-crontab
Funcionaría eso? Supongo que tendría que modificar el script cron de alguna manera. Principalmente me pregunto si hay un enfoque mejor / estándar para este problema.
Gracias.
fuente
[the build] can run into conflicts with from jobs that are tipically safe to run at those times
? ¿Hay trabajos que no son de compilación que no se pueden ejecutar durante la compilación? ¿Todos los trabajos se excluyen mutuamente? ¿O solo con respecto a la construcción?flock
orun-one
(Debian / Ubuntu)? serverfault.com/questions/82857/…Respuestas:
En lugar de jugar
crond
, sugiero implementar alguna forma (incluso simple) de bloqueo dentro de los scripts de compilación. Por ejemplo, toque y compruebe si hay un archivo en/var/run/
: si su script encuentra algo, entonces otro proceso es construir el proyecto. Obviamente, debe eliminar el archivo de bloqueo cuando haya terminado.Como @GnP señaló en los comentarios, también puede usar la
flock
utilidad para administrar semiautomáticamente sus archivos de bloqueo.Si no puede / no puede confiar en ningún mecanismo de bloqueo, simplemente emita un
service crond stop
para apagar elcrond
sistema.fuente
flock
comando sería una buena adición a esta respuesta. Maneja el archivo de bloqueo y todos los pequeños detalles que contiene.flock
el descriptor de archivo se hereda con procesos secundarios a menos que haga algún movimiento para cerrarlo. Eso a veces puede causar comportamientos inesperados, especialmente si las personas comienzan 'trabajos en segundo plano' que se ejecutan en cron.Tiendo a ajustar todos los comandos de ejecución prolongada en una pantalla y puedo
cron
iniciar la pantalla solo si todavía no hay uno en ejecución.Entonces la siguiente línea en
crontab
... se convierte en algo como esto:
Me gusta esto porque también te da la oportunidad de adjuntarte a un script en ejecución y verificar su salida / estado.
En su escenario, podría
cron
buscar otra pantalla antes de ejecutar una compilación, por ejemploCuando ejecute una compilación manual, solo
screen
acceda primero antes de ejecutar el script (comente si necesita sugerencias sobre cómo conectarse / desconectarsescreen
. Es una utilidad útil; pruébelo si aún no ha comenzado a usarlo)Escribe
screen -S ManualBuild
, presiona[enter]
y ejecuta los comandos que quieras ejecutar.Nota: Si usa el ejemplo que se proporciona, puede confundir
cron
si tiene más de 1 sesión de pantalla con un nombre de "ManualBuild" en ejecución.fuente
screen -x ScreenName
y, según su distribución (configuración de suidscreen
), puede compartir una sesión de pantalla con otros usuarios. Supongo que la forma más limpia sería ejecutar estos comandos de compilación con un nombre de usuario específico, el mismo usuario que posee el trabajo cron.