Il se trouve que je tournais autour de at
hier à 02h40. (Ne demandez pas ...) J'ai essayé de planifier des événements une minute dans le futur (comme test), et - cela ne s'est tout simplement pas produit. Les événements étaient bien dans la file d'attente, mais ils sont restés là quand il était 14h41, sans que rien ne se passe. J'ai abandonné et je me suis couché.
Ce qui se passait? Eh bien - il s'est avéré que l'heure d'été s'est terminée en Norvège (heure d'été), alors en effet 2:41 s'est produit deux fois ce soir! Et bien sûr, au second one (c.-à-d. 3:41 vu depuis l'heure d'été), at
a ensuite déclenché ces événements planifiés.
Comment cela marche-t-il? Pourquoi et comment la planification est-elle consciente du changement d'heure et choisit-elle la deuxième fois, plutôt que de simplement le faire lorsque l'heure passe l'heure spécifiée?
at
tente d'analyser la date et l'heure indiquées et les exécute via mktime()
avec "Heure d'été" définie sur -1 (non disponible, détection automatique).
at
code source:
tm1.tm_isdst = -1;
t = mktime (&tm1);
man 3 mktime
:
La valeur spécifiée dans le champ tm_isdst informe mktime () si l'heure d'été (DST) est en vigueur ou non pour l'heure fournie dans la structure tm: une valeur positive signifie que l'heure d'été est en vigueur; zéro signifie que l'heure d'été n'est pas en vigueur; et une valeur négative signifie que mktime () devrait (utiliser les informations de fuseau horaire et les bases de données système pour) tenter de déterminer si l'heure d'été est en vigueur à l'heure spécifiée.
La fonction mktime () modifie les champs de la structure tm comme suit: [...] tm_isdst est défini (quelle que soit sa valeur initiale) sur une valeur positive ou sur 0, respectivement, pour indiquer si l'heure d'été est ou n'est pas en vigueur à l'heure spécifiée.
Ainsi, mktime()
décide si l'heure d'été est ou non en vigueur; et il semble préférer la date ultérieure parmi deux choix possibles (bien que la documentation ne précise pas comment cette décision est prise).
at
le convertit ensuite en horodatage UNIX (secondes depuis le 1er janvier 1970). Et une fois que vous avez cela, il n'y a plus de changement d'heure. Le changement d'horloge d'une heure à l'autre ne change que la représentation humaine du temps ou le fuseau horaire dans lequel vous vous trouvez; il ne change pas le nombre de secondes depuis Epoch ni le nombre de secondes jusqu'à ce que la tâche soit exécutée.
J'ai essayé de planifier des événements une minute dans le futur (comme test)
Sur un sidenote, vous pouvez utiliser une expression comme next minute
, Qui s'exécutera la minute suivante, le changement d'heure ou non.