¿Existen patrones establecidos para instalar un interruptor de apagado o encendido / apagado para trabajos cron de usuario?

8

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.

Sean
fuente
¿Qué quieres decir con [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?
GnP
1
¿Has mirado la introducción flocko run-one(Debian / Ubuntu)? serverfault.com/questions/82857/…
Stefan Lasiewski
Por ejemplo, ejecutamos una gran actualización de db cada mañana. Luego, cada hora hasta la tarde, actualizamos la portada con noticias o artículos aleatorios. Si se ejecuta durante la actualización de db, la página principal puede tener algunos elementos faltantes.
Sean
No he mirado el rebaño o la corrida. Gracias.
Sean

Respuestas:

10

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 flockutilidad 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 stoppara apagar el crondsistema.

shodanshok
fuente
2
El flockcomando sería una buena adición a esta respuesta. Maneja el archivo de bloqueo y todos los pequeños detalles que contiene.
GnP
@GnP Excelente sugerencia! He actualizado mi respuesta en consecuencia
shodanshok
1
Solo tenga en cuenta que con flockel 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.
Matthew Ife
1

Tiendo a ajustar todos los comandos de ejecución prolongada en una pantalla y puedo croniniciar la pantalla solo si todavía no hay uno en ejecución.

Entonces la siguiente línea en crontab

*/2 * * * *  /bin/bash /path/to/LongRunningScript.bash

... se convierte en algo como esto:

*/2 * * * *  /usr/bin/screen -S MyUniqueName -Q select . || /usr/bin/screen -dmS MyUniqueName /bin/bash /path/to/LongRunningScript.bash

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 cronbuscar otra pantalla antes de ejecutar una compilación, por ejemplo

0 3 * * *  /usr/bin/screen -S ManualBuild -Q select . || /usr/bin/screen -dmS AutomatedBuild /bin/bash /path/to/BuildScripts.bash
10 3 * * *  /usr/bin/screen -S ManualBuild -Q select . || /usr/bin/screen -dmS OtherAutomatedBuild /bin/bash /path/to/OtherBuildScripts.bash

Cuando ejecute una compilación manual, solo screenacceda primero antes de ejecutar el script (comente si necesita sugerencias sobre cómo conectarse / desconectarse screen. 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 cronsi tiene más de 1 sesión de pantalla con un nombre de "ManualBuild" en ejecución.

trs
fuente
Lo sentimos, acabo de ver su nota "en varios usuarios": esto no funcionará en todos los usuarios sin modificación. Es necesario verificar si la pantalla de alguna manera admite la conexión a las sesiones de otros usuarios.
trs
Esa es una buena idea. Tendría que romper el hábito de los desarrolladores de dejar sus ventanas de término abiertas durante meses a la vez. :)
Sean
Si dejan abierta su sesión, puede adjuntarla a una pantalla adjunta screen -x ScreenNamey, según su distribución (configuración de suid screen), 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.
trs