94 votes

Comment définissez-vous le fuseau horaire pour crontab ?

J'ai configuré le réveil ACPI pour que mon ordinateur portable se réveille à une certaine heure chaque matin. Le fuseau horaire pour cela est UTC. Je veux également configurer mes tâches cron en utilisant UTC pour qu'elles correspondent à l'alarme de réveil.

Comment faites-vous cela ?

J'ai essayé de modifier /etc/default/cron pour inclure :

TZ="UTC"

mais ça ne fonctionne pas. (J'ai aussi essayé TZ=UTC et TZ="UTC/GMT")

Des idées ?

74voto

Michal Points 405

J'avais un problème similaire sur Trusty (14.04). Je l'ai résolu en définissant le fuseau horaire de la machine, puis en redémarrant le service cron

  1. sudo dpkg-reconfigure tzdata - suivez les instructions pour sélectionner la région/pays
  2. sudo service cron restart
  3. timedatectl - Vérifiez vos paramètres de date

21voto

mohit_rocks Points 191

Il n'y a pas de moyen facile d'y parvenir. cron utilise l'heure locale. /etc/default/cron et d'autres spécifications TZ dans le crontab spécifient simplement quelle TZ doit être utilisée pour les processus lancés par cron, cela n'affecte pas l'heure de démarrage.

La plupart des solutions que j'ai vues impliquent un utilitaire intermédiaire, donc cron lancerait quelque chose qui déterminerait ensuite quand démarrer en UTC (par exemple, si vous savez que vous êtes uniquement concerné par les changements d'heure d'été, démarrez-le 2 heures avant, calculez la différence de temps et démarrez à ce moment-là. Jetez un œil à at. Pour ce faire, les gens utilisent souvent perl ou python ou des langages de script similaires).

Il y a un moyen vilain de le pirater si vous le souhaitez. cron ne lit les informations de TZ du système qu'au démarrage. Donc, si c'est un serveur en fonctionnement constant, vous pourriez simplement définir TZ sur UTC, redémarrer, et après le démarrage le définir sur votre fuseau horaire local. Vous pourriez également scripter cela.

En guise d'approche alternative, jetez également un œil à la syntaxe @reboot de cron, qui devrait exécuter des scripts après le démarrage, ce qui semble être ce que vous voulez.

20voto

Vinicius Egerland Points 301

Il existe un fichier qui contrôle le fuseau horaire du système.. Je viens juste d'avoir le même problème, voici la solution:

Si vous n'avez pas configuré manuellement de fuseau horaire, l'exécution de date devrait afficher l'heure UTC.

  • créez une sauvegarde

    sudo cp /etc/localtime /etc/localtime.bkp
  • supprimez le fichier:

    sudo rm /etc/localtime
  • J'habite à Chicago, (vous devrez peut-être changer le chemin, en utilisant la touche tabulation) donc:

    sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
  • Ensuite redémarrez. Lorsque votre système redémarre, exécutez: date

  • maintenant votre fuseau horaire devrait être correct, et cron va le prendre en compte.

Pour info: définir la variable TZ est une solution temporaire, et peut parfois agir comme un "masque".

15voto

damage000 Points 603

Au mois de mars 2017, j'ai découvert que crond prend en charge la variable CRON_TZ dans chaque crontab.

La variable CRON_TZ spécifie le fuseau horaire spécifique pour le tableau cron. L'utilisateur doit entrer une heure selon le fuseau horaire spécifié dans le tableau. L'heure utilisée pour écrire dans un fichier journal est prise à partir du fuseau horaire local, où le démon s'exécute.

— citation de la page manuelle crontab (5)

Cela m'a permis de spécifier l'heure d'exécution de chaque tâche cron en heure locale, qui tenait automatiquement compte de l'heure d'été, tandis que le serveur restait en UTC.

Notez que c'était dans la distribution CentOS 7 avec cronie 1.4.

8voto

James Parks Points 137

D'accord, j'ai pris un peu de temps et j'ai trouvé comment faire cela sur Ubuntu Natty, et voici comment j'ai réussi à le faire fonctionner. Il y a peut-être une manière plus élégante, mais cette méthode fonctionne.

Tout d'abord, nous devons envelopper l'exécutable cron dans un shell qui définit la variable TZ. Voici comment faire :

cd /usr/sbin
mv cron cron.real

Ensuite, créez un nouveau fichier /usr/sbin/cron. J'ai utilisé vim, mais vous pouvez utiliser n'importe quel éditeur que vous voulez, assurez-vous simplement que le fichier ressemble à ceci :

#!/bin/bash
export TZ=UTC
/usr/sbin/cron.real

Rendez le nouveau fichier cron exécutable :

chmod ugo+rx cron

Maintenant, redémarrez le démon cron :

service cron restart

Vos tâches cron s'exécuteront désormais selon un horaire basé sur l'UTC -- CEPENDANT, même si l'heure à laquelle elles sont exécutées sera en UTC, lorsqu'elles s'exécuteront, la timezone sera définie en fonction de ce qui est défini pour le système. Pour changer cela, ajoutez ceci dans votre crontab avant toute commande :

TZ=UTC

Ainsi, votre crontab ressemblera à ceci :

# Éditez ce fichier pour introduire les tâches à exécuter par cron.
# 
# Chaque tâche à exécuter doit être définie à travers une seule ligne
# indiquant avec différents champs quand la tâche sera exécutée
# et quelle commande exécuter pour la tâche
# 
# Pour définir l'heure, vous pouvez fournir des valeurs concrètes pour
# minute (m), heure (h), jour du mois (dom), mois (mon),
# et jour de la semaine (dow) ou utiliser '*' dans ces champs (pour 'n'importe quand').# 
# Notez que les tâches seront lancées en fonction du temps et des fuseaux horaires du système cron.
# 
# La sortie des tâches du crontab (y compris les erreurs) est envoyée par
# email à l'utilisateur auquel appartient le fichier crontab (sauf redirigé).
# 
# Par exemple, vous pouvez exécuter une sauvegarde de tous vos comptes utilisateur
# à 5h du matin chaque semaine avec :
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# Pour plus d'informations, consultez les pages de manuel de crontab(5) et cron(8)
# 
# m h  dom mon dow   commande
TZ=UTC
00 19 * * * date > /tmp/date.log

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X