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


63

J'ai configuré le réveil ACPI afin que mon ordinateur portable se réveille à une heure précise chaque matin. Le fuseau horaire correspondant est UTC. Je veux configurer mes crontabs en utilisant également le temps UTC afin qu’elles s’intègrent avec l’alarme de réveil.

Comment faites-vous?

J'ai essayé l'édition /etc/default/cronpour inclure:

TZ="UTC"

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

Des idées?


1
as-tu fait une sudo service cron restartpost-édition?
Rinzwind le

1
Non ... mais j'ai essayé et ça n'a pas fait de différence.
Alj


Réponses:


45

J'ai eu un problème similaire sur Trusty (14.04). Résolu en réglant le fuseau horaire de la machine, puis en redémarrant le cronservice.

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

1
Après avoir défini le fuseau horaire, vous pouvez taper datesur la ligne de commande pour confirmer que la date est correcte, conformément à vos attentes.
mydoghasworms

J'ai redémarré cron, mais il utilise toujours l'ancien fuseau horaire (UTC)?
Luke Fisk-Lennon

Cela a fonctionné parfaitement pour moi le 18.10. ~ $ date renvoie l'heure correcte. Il faut aimer ces interfaces graphiques de style DOS aux couleurs vives! Merci.
itsricky

18

Il n'y a pas de moyen facile d'y parvenir. cron utilise l'heure locale. /etc/default/cronet les autres TZspécifications de la crontab spécifient simplement ce qui TZdoit être utilisé pour les processus lancés par cron, cela n’a aucune incidence sur l’heure de début.

La plupart des solutions que j'ai vues impliquent un utilitaire situé au centre. Cron lancera donc quelque chose qui déterminera ensuite le moment opportun pour démarrer en UTC (par exemple, si vous savez que vous êtes uniquement préoccupé par les modifications de l'heure d'été, démarrez-le 2 heures différence de temps, et le coup d'envoi puis. Jetez un oeil à at. Pour ce faire, les gens utilisent souvent perlou pythonou langages de script similaires).

Il existe un mauvais moyen de le pirater si vous le vouliez. cron ne lit que les informations TZ sur le système au démarrage. Donc, s'il s'agit d'un serveur qui fonctionne toujours, vous pouvez définir TZ sur UTC, redémarrer l'ordinateur et, après le démarrage, le configurer sur votre fuseau horaire local. Vous pouvez aussi écrire un script pour cela.

En guise d’approche alternative, jetez également un coup d’œil à la @rebootsyntaxe de cron, qui devrait exécuter les scripts après le démarrage, ce qui ressemble à ce que vous pourriez souhaiter.


14

Il y a un fichier qui contrôle le fuseau horaire du système. Je viens de recevoir le même problème, voici la solution:

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

  • créer une sauvegarde

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

    sudo rm /etc/localtime
    
  • J'habite à Chicago (vous devrez peut-être modifier le chemin en utilisant la touche de tabulation pour vous aider), alors

    sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
    
  • Puis redémarrez. Au démarrage de votre système: date

  • maintenant, votre fuseau horaire devrait être là, et cron examinera cela.

FYI: la définition de la variable TZ est une solution temporaire et peut parfois servir de "masque".


1
+1 pour une solution compatible CentOS (et EC2 Amazon Linux). Un redémarrage complet peut être une bonne idée, mais pour moi, cela a datefonctionné sans redémarrer, et un redémarrage immédiat du système d'exploitation sudo service crond restarta suffi à corriger les temps de travail cron.
davur

+1 merci ça marche.
Jim

13

Depuis 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 à la table cron. L'utilisateur doit entrer une heure en fonction du fuseau horaire spécifié dans le tableau. L'heure utilisée pour l'écriture dans un fichier journal provient du fuseau horaire local où le démon est en cours d'exécution.

- citation de la page de manuel de crontab (5)

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


J'ai aussi trouvé ce lien utile: serverfault.com/questions/848829/… . Pour trouver l'option de fuseau horaire dont j'avais besoin, je suis entré ls /usr/share/zoneinfo/Americapour voir les options.
Cheevahagadog

7

D'accord, j'ai pris un peu de temps pour comprendre 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 façon fonctionne.

Tout d’abord, nous devons intégrer l’exécutable cron dans un shell définissant la variable TZ. Voici comment:

cd /usr/sbin
mv cron cron.real

Ensuite, créez un nouveau fichier / usr / sbin / cron. J'ai utilisé vim, mais vous pouvez utiliser l'éditeur de votre choix, il suffit de donner au fichier l'apparence suivante:

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

Rendre le nouveau fichier cron exécutable:

chmod ugo+rx cron

Maintenant, redémarrez le démon cron:

service cron restart

Vos tâches cron seront maintenant exécutées selon une planification basée sur l'heure UTC - CEPENDANT, même si l'heure de leur exécution est l'heure UTC, leur fuseau horaire est défini sur celui défini pour le système. Pour changer cela, mettez ceci dans votre crontab avant toute commande:

TZ=UTC

Donc, votre crontab ressemblera à quelque chose comme ça:

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
TZ=UTC
00 19 * * * date > /tmp/date.log

1
Quel est l'intérêt de placer TZ = UTC à deux endroits? Ne pouvez-vous pas simplement le mettre dans le fichier crontab?
Phương Nguyễn

Non. Mettre TZ = UTC dans le fichier crontab ne le définit que pour les tâches cron, pas pour le cron lui-même. Cela n'affecte pas le timing de l'exécution du travail.
Mark Reed

5
  1. Voir /etc/default/cron. Vous pouvez définir TZici pour -all- crontabs et il devrait être TZ=UTCiirc. Votre méthode aurait donc dû fonctionner.

  2. Regardez fcron . Vous pouvez définir des crontabs individuelles à différents fuseaux horaires:

    timezone-name 'time zone of the system'

    Exécuter le travail dans le fuseau horaire indiqué. nom-timezone est une chaîne valable pour la variable d'environnement TZ: reportez-vous à la documentation de votre système pour plus de détails. Par exemple, "Europe / Paris" est valable sur un système Linux. Cette option gère correctement les modifications de l'heure d'été. La variable d’environnement TZ est définie sur la valeur de timezone lorsqu’un travail définissant cette option est exécuté.

    Veuillez noter que si vous donnez un argument de nom de fuseau horaire erroné, il sera silencieusement ignoré et le travail sera exécuté dans le fuseau horaire du système.


Eh bien, j'ai vérifié et la crontab ne fonctionne que lorsque je règle l'heure de déclenchement sur l'heure locale. Régler l'heure sur UTC ne fonctionne tout simplement pas.
Alj

bien 4 ans plus tard et j'ai eu un coup d' oeil au fichier / etc / default / cron et cela est maintenant officiellement abandonné
the0ther

Un vote après 4 ans? Oui, cela n’est plus valide maintenant, mais ce n’était pas rentré dans la journée. Là encore, personne n’est plus l’utilisateur 11.04, je l’espère.
Rinzwind

3
Si cette réponse est invalide, vous devriez probablement la supprimer; il est inutile de garder sciemment des informations erronées sur StackExchange. Qu'il ait l' habitude d'être sur le sujet et / ou correct est à peu près sans importance pour quiconque visitant cette page à la recherche d'informations correctes.
Quuxplusone

4

S'il vous plaît voir mon prochain post pour une solution spécifique à Ubuntu

Je sais que ceci est un forum Ubuntu, mais je pense que la réponse sera très similaire à la façon dont vous procéderiez sur un système Red Hat. Je n'ai pas de système Ubuntu à portée de la main pour le tester, mais je l'ai testé sur Red Hat.

Tout ce que vous avez à faire est d'ajouter une ligne à votre script init du démon cron. Définissez et exportez la variable d’environnement TZ, comme ceci:

export TZ=UTC

Puis redémarrez votre démon cron. Assurez-vous de bien placer cette exportation dans le script de démarrage du démon cron APRÈS toute autre configuration de variable et d’approvisionnement. Je pense que c’est peut-être pour cette raison que la modification du /etc/default/cronscript par l’affiche originale ne fonctionnait pas pour lui. Peut-être l'a-t-il défini, mais il a ensuite été réinitialisé par un élément plus bas dans le script.

Notez que cela n'affectera que le démon cron lui-même, et non les tâches que vous exécutez via cron. Par conséquent, si vous souhaitez qu'un travail cron utilise le fuseau horaire UTC, vous devez également le définir dans le travail lui-même.

Vous ne pouvez probablement pas copier ce compte rendu et le faire fonctionner sur une boîte Ubuntu, mais voici le script d’initiation que j’avais utilisé pour le tester sur Red Hat. Vous trouverez l'exportation juste avant la start()fonction:

#!/bin/sh
#
# crond          Start/Stop the cron clock daemon.
#
# chkconfig: 2345 90 60
# description: cron is a standard UNIX program that runs user-specified \
#              programs at periodic scheduled times. vixie cron adds a \
#              number of features to the basic UNIX cron, including better \
#              security and more powerful configuration options.

### BEGIN INIT INFO
# Provides: crond crontab
# Required-Start: $local_fs $syslog
# Required-Stop: $local_fs $syslog
# Default-Start:  2345
# Default-Stop: 90
# Short-Description: run cron daemon
# Description: cron is a standard UNIX program that runs user-specified 
#              programs at periodic scheduled times. vixie cron adds a 
#              number of features to the basic UNIX cron, including better 
#              security and more powerful configuration options.
### END INIT INFO

[ -f /etc/sysconfig/crond ] || { 
    [ "$1" = "status" ] && exit 4 || exit 6 
}

RETVAL=0
prog="crond"
exec=/usr/sbin/crond
lockfile=/var/lock/subsys/crond
config=/etc/sysconfig/crond

# Source function library.
. /etc/rc.d/init.d/functions

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

export TZ=UTC
start() {
    if [ $UID -ne 0 ] ; then
        echo "User has insufficient privilege."
        exit 4
    fi
    [ -x $exec ] || exit 5
    [ -f $config ] || exit 6
    echo -n $"Starting $prog: "
    daemon $prog $CRONDARGS
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
}

stop() {
    if [ $UID -ne 0 ] ; then
        echo "User has insufficient privilege."
        exit 4
    fi
    echo -n $"Stopping $prog: "
    if [ -n "`pidfileofproc $exec`" ]; then
        killproc $exec
        RETVAL=3
    else
        failure $"Stopping $prog"
    fi
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
}

restart() {
    stop
    start
}

reload() {
    echo -n $"Reloading $prog: "
    if [ -n "`pidfileofproc $exec`" ]; then
        killproc $exec -HUP
    else
        failure $"Reloading $prog"
    fi
    retval=$?
    echo
}

force_reload() {
    # new configuration takes effect after restart
    restart
}

rh_status() {
    # run checks to determine if the service is running or use generic status
    status -p /var/run/crond.pid $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}


case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
        restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
esac
exit $?

0

Je viens de comprendre cela sur Ubuntu 14/16. A parfaitement fonctionné pour moi.

Étapes (impliquées):

cat /etc/timezone
rm -fv /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Kolkata /etc/localtime
apt install -y --reinstall tzdata
/etc/init.d/rsyslog restart
tail -f /var/log/syslog
cat /etc/timezone

0

Qu'en est-il de l'évaluation du temps utc dans un script shell? Planifiez le script shell pour qu'il s'exécute toutes les heures. En haut du script, obtenez l'heure UTC à partir de la commande date. Si ce n'est pas l'heure UTC souhaitée, quittez.

Ce script se fermera s'il n'est pas 1h du matin.

#!/bin/bash
if [ $(date -u +"%H") != "01" ]; then
 exit 0
fi

0

Vous pouvez définir la variable d'environnement CRON_TZ Si le travail cron est exécuté sur un serveur distant, vous devriez probablement remarquer que le shell utilisé par crontab est sh . Vous pouvez vérifier sur / etc / crontab .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.