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

53

J'ai configuré le réveil ACPI afin que mon ordinateur portable se réveille à une heure précise chaque matin. Le fuseau horaire pour cela 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 cela?

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

TZ="UTC"

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

Des idées?

    
posée alj 24.07.2011 - 19:40
la source

10 réponses

34

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

  1. sudo dpkg-reconfigure tzdata - suivez les instructions pour sélectionner une région / un pays
  2. sudo service cron restart
réponse donnée onlyjsmith 13.10.2014 - 12:51
la source
15

Il n’ya pas de moyen facile d’y parvenir. cron utilise l'heure locale. /etc/default/cron et les autres spécifications TZ de la crontab spécifient simplement quel TZ doit ê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 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 avant. , calculez la différence de temps et lancez-la ensuite. Consultez at . Pour ce faire, les gens utilisent souvent perl ou python ou des 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 simplement définir TZ sur UTC, redémarrer l'ordinateur et, après le démarrage, le configurer sur votre fuseau horaire local. Vous pouvez également écrire ce script.

Comme approche alternative, jetez également un coup d'oeil à la syntaxe @reboot de cron, qui devrait exécuter les scripts après le démarrage, ce qui ressemble à ce que vous voudrez peut-être.

    
réponse donnée Cookie 11.07.2012 - 19:26
la source
9

Un fichier contrôle le fuseau horaire du système. Je viens de recevoir le même problème, voici la solution:

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

  • créer une sauvegarde

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

    sudo rm /etc/localtime
    
  • Je vis à Chicago (vous devrez peut-être modifier le chemin d'accès, en utilisant les touches de tabulation):

    sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
    
  • Ensuite, redémarrez. Lorsque votre démarrage du système effectue: date

  • maintenant votre fuseau horaire devrait être là, et cron va regarder ça.

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

    
réponse donnée Vinicius Egerland 08.02.2015 - 00:44
la source
8

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

The CRON_TZ variable specifies the time zone specific for the cron table. The user should enter a time according to the specified time zone into the table. The time used for writing into a log file is taken from the local time zone, where the daemon is running.

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

Cela m’a permis de spécifier l’heure d’exécution de chaque travail cron à l’heure locale, qui comptabilisait automatiquement l’heure d’été, tandis que le serveur était au format UTC.

    
réponse donnée Keith Shaw 30.03.2017 - 21:12
la source
6

OK, 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 un moyen plus élégant, mais ça marche.

Premièrement, nous avons besoin d’envelopper l’exécutable cron dans un shell définissant la variable TZ. Voici comment:

cd /usr/sbin
mv cron cron.real

Créez ensuite un nouveau fichier / usr / sbin / cron. J'ai utilisé vim, mais vous pouvez utiliser l'éditeur de votre choix, il suffit de faire ressembler le fichier à ceci:

#!/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 périodiques s'exécuteront désormais selon une planification basée sur l'heure UTC. Cependant, même si leur heure d'exécution est 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

Ainsi, votre crontab ressemblera à quelque chose comme ceci:

# 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
    
réponse donnée James Parks 10.03.2013 - 20:08
la source
5
  1. Voir /etc/default/cron . Vous pouvez définir TZ ici pour -all-crontabs et il devrait s'agir de TZ=UTC iirc. Votre méthode aurait donc dû fonctionner.

  2. Consultez 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 valide 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.

réponse donnée Rinzwind 24.07.2011 - 19:48
la source
4

Veuillez consulter mon prochain message pour une solution spécifique à Ubuntu

Je sais que c'est un forum Ubuntu, mais je pense que la réponse sera très similaire à celle que vous utiliseriez 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

Ensuite, 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 script /etc/default/cron 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 fonction start() :

#!/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 $?
    
réponse donnée James Parks 10.03.2013 - 16:08
la source
0

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

Étapes (sous-entendu):

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
    
réponse donnée kintuparantu 14.02.2017 - 07:29
la source
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 utc.

#!/bin/bash
if [ $(date -u +"%H") != "01" ]; then
 exit 0
fi
    
réponse donnée user754068 31.10.2017 - 01:02
la source
0

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

    
réponse donnée PT Huynh 21.06.2018 - 02:51
la source

Lire d'autres questions sur les étiquettes