Solución 1:
fcron es compatible con esta función.
De la documentación de la opción "timezone" 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 correctamente los cambios de horario de verano. La variable de entorno TZ se establece en el valor de la zona horaria cuando se ejecuta un trabajo que define esta opción.
Solución 2:
Creo que estás tratando de tener las dos cosas 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, entonces ejecute su sistema (y cron) en 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 , luego ejecuta cron según 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 las conversiones para su conveniencia luego escribe un script de conversión que acepta una especificación cron y una zona horaria, luego 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 dices lo que realmente estás tratando de lograr .
Solución 3:
Podrías escribirte un pequeño envoltorio que tome tres argumentos:
- Hora de la zona horaria objetivo para que coincida
- Zona horaria objetivo
- Comando para ejecutar si la hora objetivo en tz coincide con la hora actual (en tz objetivo).
Luego simplemente coloque esa línea de envoltorio 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)