Un remplacement cron qui gère plusieurs fuseaux horaires

8

Je recherche un remplacement cron (ou une méthode dans cron si possible) qui peut permettre la planification des travaux dans n'importe quel nombre de fuseaux horaires (spécifiquement plus d'un par utilisateur / fichier). Ce que je voudrais, c'est la possibilité de spécifier un fuseau horaire par tâche (ou ligne cron), puis de spécifier uniquement les heures dans les fuseaux horaires locaux. Je remarque que je peux modifier l'intégralité du cron de fuseau horaire, mais à la fin de la journée, il ne peut fonctionner que dans un seul fuseau horaire.

Ma solution actuelle consiste à convertir toutes mes heures en GMT et à exécuter les travaux en conséquence, le seul problème est pendant les semaines de passage à l'heure d'été, de nombreuses modifications manuelles doivent être effectuées afin de s'assurer que les choses fonctionnent correctement dans le fuseau horaire local respectif (par exemple certains les régions ne suivent pas l'heure d'été ou ne changent pas à la même date).

Des réflexions à ce sujet?

mgray
la source

Réponses:

3

Je pense que vous essayez d'avoir les deux choses et la réalité est que vous ne pouvez tout simplement pas. Si vous souhaitez qu'un travail s'exécute à 8 h, heure locale, par exemple, que l'heure d'été soit active ou non, vous exécutez votre système (et cron) à l'heure locale et ne faites pas de modifications saisonnières ou vous l'exécutez en UTC ( pas GMT) et effectuez des modifications saisonnières. Si vous voulez que vos travaux à exécuter en même UTC, quel que soit , vous exécutez Cron selon UTC et il n'y a plus rien à faire.

Si ce que vous voulez, c'est qu'un utilisateur puisse planifier un travail cron en fonction de son fuseau horaire local et qu'il n'ait pas à penser aux conversions pour sa commodité, vous écrivez un script de conversion qui accepte une spécification cron et un fuseau horaire, puis fait la conversion en UTC dans les coulisses et édite la 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 sera utile de nous dire ce que vous essayez réellement d'accomplir .

En pause jusqu'à nouvel ordre.
la source
6

fcron prend en charge cette fonctionnalité.

De la documentation de l'option "timezone" dans fcrontab (5) :

Exécutez le travail dans le fuseau horaire donné. timezone-name 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é.

jroller
la source
fcronsemble être assez ancien et n'a pas d'installation par défaut dans ubuntu. N 'y a-t-il pas une autre solution?
silgon
Il semble que fcron ait été supprimé de Debian en 2011 en raison d'être "cassé et obsolète" :(
Peter Green
3

Vous pourriez vous écrire un petit wrapper qui prend trois arguments:

  • Heure du fuseau horaire cible pour correspondre
  • Fuseau horaire cible
  • Commande à exécuter si l'heure cible tz correspond à l'heure actuelle (dans la cible tz).

Ensuite, mettez simplement cette ligne wrapper dans votre crontab pour exécuter 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)
jasonjwwilliams
la source
0

Je vous recommande d'utiliser le temps universel coordonné (UTC), il n'est pas affecté par l'heure d'été. Voir les réponses à «changement d'heure d'hiver et d'été sans interruption dans la chronologie». . C'est aussi ce qu'il est généralement préférable pour le temps système.

Kyle Brandt
la source
Je suppose que je n'ai pas clarifié ma question assez ... Mon problème est que j'ai besoin d'emplois pour fonctionner à 8h heure locale dans une région (disons Afrique du Sud / Johannesburg). Lorsque l'heure d'été se produit, le décalage UTC finira par changer pour tenir compte de la nouvelle heure locale et nécessitera une modification manuelle pour en tenir compte. Est-ce que cela a du sens ou est-ce que je manque quelque chose ici?
mgray
Voir ce que Dennis a dit, il a raison :-)
Kyle Brandt
0

Il y a un port de launchd de darwin pour FreeBSD qui fera tout ce que vous voulez si vous êtes sur FreeBSD.

https://github.com/freebsd/openlaunchd

Et il y a jobd, qui est pour * BSD et Linux.

https://github.com/mheily/jobd

lbutlr
la source
1
Est-il possible de partager la partie de la configuration ou du lien où l'on pourrait voir comment configurer le fuseau horaire pour un travail donné?
silgon
-1

Cfengine est notre façon de procéder. Vous pouvez configurer des travaux en utilisant l'heure locale (qui s'adapte à l'heure d'été) ou GMT pour des travaux simultanés. Vous pouvez créer tout type de calendrier personnalisé, à quelques exceptions près. Je sais que vous pouvez payer une tonne d'argent pour un logiciel de planification, mais nous n'avons jamais eu besoin de plus que cela, même avec des centres de données dans 3 endroits à travers le monde.

SAnnukka
la source