Un reemplazo cron que maneja múltiples zonas horarias

8

Estoy buscando un reemplazo de cron (o un método en cron si es posible) que pueda permitir la programación de trabajos en cualquier número de zonas horarias (específicamente más de uno por usuario / archivo). Lo que me gustaría es la capacidad de especificar una zona horaria por trabajo (o línea cron), y luego solo especificar horas en zonas horarias locales. Noto que puedo cambiar la zona horaria completa en la que se ejecuta cron, pero al final del día solo puede ejecutarse en una zona horaria.

Mi solución actual es convertir todos mis tiempos a GMT y ejecutar trabajos en consecuencia, el único problema es durante el cambio de horario de verano durante las semanas, se deben realizar muchas ediciones manuales para asegurarse de que las cosas funcionen correctamente en la zona horaria local respectiva (por ejemplo, algunas las regiones no siguen el horario de verano o no cambian en la misma fecha).

Tiene alguna idea sobre esto?

mgray
fuente

Respuestas:

3

Creo que estás tratando de tenerlo en ambos sentidos y la realidad es que simplemente no puedes. Si desea que un trabajo se ejecute a las 8 a.m., hora local, por ejemplo, independientemente de si el horario de verano está activo, ejecute su sistema (y cron) en la hora local y no realice ediciones estacionales o lo ejecute en UTC ( no GMT) y hacer ediciones estacionales. Si desea que sus trabajos se ejecuten en el mismo UTC, independientemente , entonces ejecuta cron de acuerdo con UTC y no hay nada más que hacer.

Si lo que desea es que un usuario pueda programar un trabajo cron de acuerdo con su zona horaria local y no tener que pensar en conversiones para su conveniencia, entonces escriba un script de conversión que acepte una especificación cron y una zona horaria. realiza la conversión a UTC detrás de escena y edita el crontab para él. Incluso podría ser una conversión bidireccional para manejar los cambios en las entradas existentes.

Será útil si nos cuenta lo que realmente está tratando de lograr .

Pausado hasta nuevo aviso.
fuente
6

fcron es compatible con esta función.

De la documentación de la opción "zona horaria" en fcrontab (5) :

Ejecute el trabajo en la zona horaria dada. timezone-name es una cadena que es válida para la variable de entorno TZ: consulte la documentación de su sistema para obtener más detalles. Por ejemplo, "Europa / París" es válido en un sistema Linux. Esta opción maneja los cambios de horario de verano correctamente. La variable de entorno TZ se establece en el valor de la zona horaria cuando se ejecuta un trabajo que define esta opción.

jroller
fuente
fcronparece ser bastante viejo y no tiene instalación predeterminada en ubuntu. hay alguna otra solucion?
silgon
Parece que fcron fue eliminado de Debian en 2011 debido a que estaba "roto y desactualizado" :(
Peter Green
3

Podrías escribir un pequeño contenedor que tenga tres argumentos:

  • Hora objetivo de la zona horaria para que coincida
  • Zona horaria objetivo
  • Comando para ejecutar si la hora tz objetivo coincide con la hora actual (en tz objetivo).

Luego, simplemente ponga esa línea de envoltura en su crontab para que se ejecute cada hora:

python tz_wrapper.py 14 "US/Mountain" "echo 'hi'"

Versión simple de Python:

#!/usr/bin/python
import sys, os, datetime
import pytz

arg_hour = sys.argv[1]
arg_timezone = sys.argv[2]
arg_cmd = sys.argv[3]

target_tz = pytz.timezone(arg_timezone)
target_hour = pytz.utc.localize(datetime.datetime.utcnow()).astimezone(target_tz).strftime("%H")

if target_hour == str(arg_hour):
    os.system(arg_cmd)
jasonjwwilliams
fuente
0

Le recomiendo que use el horario universal coordinado (UTC), no se ve afectado por el horario de verano. Vea las respuestas a "cambio de horario de invierno y verano sin interrupción en la línea de tiempo". . Esto es lo que generalmente es mejor para el tiempo del sistema también.

Kyle Brandt
fuente
Supongo que no hice mi pregunta lo suficientemente clara ... Mi problema es que necesito trabajos para ejecutar a las 8 AM hora local en una región (por ejemplo, Sudáfrica / Johannesburgo). Cuando se produce el horario de verano, el desplazamiento UTC terminará cambiando para dar cuenta de la nueva hora local y requerirá una edición manual para dar cuenta de eso. ¿Tiene sentido, o me estoy perdiendo algo aquí?
mgray
Vea lo que dijo Dennis, tiene razón :-)
Kyle Brandt
0

Hay un puerto de launchd de darwin para FreeBSD que hará todo lo que quieras si estás en FreeBSD.

https://github.com/freebsd/openlaunchd

Y hay jobd, que es para * BSD y Linux.

https://github.com/mheily/jobd

lbutlr
fuente
1
¿Es posible compartir la parte de la configuración o el enlace donde se puede ver cómo configurar la zona horaria para un trabajo determinado?
silgon
-1

Cfengine es la forma en que hacemos esto. Puede configurar trabajos utilizando la hora local (que se adapta al horario de verano) o GMT para trabajos simultáneos. Puede crear cualquier tipo de calendario personalizado, con excepciones. Sé que puede pagar una tonelada de dinero por programar software, pero nunca necesitamos nada más que esto, incluso con centros de datos en 3 ubicaciones en todo el mundo.

SAnnukka
fuente