Solution 1 :
fcron prend en charge cette fonctionnalité.
À partir de la documentation de l'option "fuseau horaire" dans fcrontab(5) :
Exécutez la tâche dans le fuseau horaire donné. Le nom du fuseau horaire est une chaîne valide pour la variable d'environnement TZ :consultez la documentation de votre système pour plus de détails. Par exemple, "Europe/Paris" est valide sur un système Linux. Cette option gère correctement les changements d'heure d'été. La variable d'environnement TZ est définie sur la valeur du fuseau horaire lorsqu'un travail définissant cette option est exécuté.
Solution 2 :
Je pense que vous essayez d'avoir les deux sens et la réalité est que vous ne pouvez tout simplement pas. Si vous souhaitez qu'un travail s'exécute à 8 heures du matin, heure locale, par exemple, que l'heure d'été soit active ou non, vous exécutez soit votre système (et cron) à l'heure locale et ne faites pas de modifications saisonnières, soit vous l'exécutez en UTC ( pas GMT) et faire des modifications saisonnières. Si vous souhaitez que vos tâches s'exécutent au même UTC, peu importe , puis vous lancez cron selon UTC et il n'y a plus rien à faire.
Si ce que vous voulez, c'est qu'un utilisateur puisse programmer une tâche cron en fonction de son fuseau horaire local et qu'il ne doive pas penser aux conversions pour sa commodité puis vous écrivez un script de conversion qui accepte une spécification cron et un fuseau horaire puis effectue la conversion en UTC dans les coulisses et édite le crontab pour lui. Il pourrait même s'agir d'une conversion bidirectionnelle pour gérer les modifications apportées aux entrées existantes.
Il serait utile que vous nous disiez ce que vous essayez réellement d'accomplir .
Solution 3 :
Vous pourriez vous écrire un petit wrapper qui prend trois arguments :
- L'heure du fuseau horaire cible doit correspondre
- Fuseau horaire cible
- Commande à exécuter si l'heure tz cible correspond à l'heure actuelle (en tz cible).
Ensuite, placez simplement cette ligne wrapper dans votre crontab pour qu'elle s'exécute toutes les heures :
python tz_wrapper.py 14 "US/Mountain" "echo 'hi'"
Version python simple :
#!/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)