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 ?

5voto

Rinzwind Points 270388
  1. Voir /etc/default/cron. Vous pouvez définir TZ ici pour -toutes- les crontabs et il devrait être TZ=UTC si je me souviens bien. Donc votre méthode aurait dû fonctionner.

  2. Jetez un œil à fcron. Vous pouvez définir des crontabs individuels à différents fuseaux horaires :

    nom-du-fuseau-horaire 'fuseau horaire du système'

    Exécutez le travail dans le fuseau horaire donné. nom-du-fuseau-horaire est une chaîne qui est 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 lorsque qu'un travail définissant cette option est exécuté.

    Veuillez noter que si vous donnez un argument nom-de-fuseau-horaire erroné, il sera IGNORÉ discrètement, et le travail s'exécutera dans le fuseau horaire du système.

4voto

James Parks Points 137

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

Je sais que c'est un forum Ubuntu, mais je crois que la réponse sera très similaire à la manière dont vous le feriez sur un système Red Hat. Je n'ai pas de système Ubuntu sous la main pour tester cela, mais je l'ai testé sur Red Hat.

Tout ce que vous avez à faire est d'ajouter une ligne à votre script d'initialisation 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 placer cet export dans le script de démarrage du démon cron APRÈS tout autre paramétrage de variables et de sourcing - je pense que c'est peut-être pourquoi la modification du script /etc/default/cron de l'auteur initial n'a pas fonctionné pour lui. Peut-être qu'il l'a défini, mais il a ensuite été réinitialisé par quelque chose d'autre plus bas dans le script.

Remarquez que cela n'affectera que le démon cron lui-même, et non les tâches que vous exécutez via cron, donc si vous voulez qu'une tâche cron utilise UTC comme fuseau horaire, vous devrez également le définir dans la tâche elle-même.

Vous ne pouvez probablement pas copier cela mot pour mot et le faire fonctionner sur une boîte Ubuntu, mais voici le script d'initialisation que j'ai utilisé pour tester cela sur Red Hat. Vous trouverez l'export juste avant la fonction start() :

#!/bin/sh
#
# crond          Démarrer/Arrêter le démon d'horloge cron.
#
# chkconfig: 2345 90 60
# description: cron est un programme UNIX standard qui exécute des programmes spécifiés par l'utilisateur à des intervalles planifiés. vixie cron ajoute un certain nombre de fonctionnalités au cron UNIX de base, y compris une meilleure sécurité et des options de configuration plus puissantes.

### BEGIN INIT INFO
# Fournit: crond crontab
# Nécessaire-Démarrage: $local_fs $syslog
# Nécessaire-Arrêt: $local_fs $syslog
# Démarrage-Par-Défaut:  2345
# Arrêt-Par-Défaut: 90
# Description-Courte: exécute le démon cron
# Description: cron est un programme UNIX standard qui exécute des programmes spécifiés par l'utilisateur 
#              à des intervalles planifiés. vixie cron ajoute un 
#              certain nombre de fonctionnalités au cron UNIX de base, y compris une meilleure 
#              sécurité et des options de configuration plus puissantes.
### 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

# Bibliothèque de fonctions source.
. /etc/rc.d/init.d/functions

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

export TZ=UTC
start() {
    if [ $UID -ne 0 ] ; then
        echo "L'utilisateur n'a pas suffisamment de privilèges."
        exit 4
    fi
    [ -x $exec ] || exit 5
    [ -f $config ] || exit 6
    echo -n $"Démarrage de $prog : "
    daemon $prog $CRONDARGS
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
}

stop() {
    if [ $UID -ne 0 ] ; then
        echo "L'utilisateur n'a pas suffisamment de privilèges."
        exit 4
    fi
    echo -n $"Arrêt de $prog : "
    if [ -n "`pidfileofproc $exec`" ]; then
        killproc $exec
        RETVAL=3
    else
        failure $"Arrêt de $prog"
    fi
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
}

restart() {
    stop
    start
}

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

force_reload() {
    # la nouvelle configuration prend effet après le redémarrage
    restart
}

rh_status() {
    # effectuer des vérifications pour déterminer si le service est en cours d'exécution ou utiliser un statut générique
    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 $"Utilisation : $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
esac
exit $?

1voto

bpang Points 11

Vous pouvez également utiliser timedatectl pour trouver et définir le fuseau horaire. (Ubuntu 18)

timedatectl list-timezones
timedatectl set-timezone America/Los_Angeles
service cron restart

0voto

Varun Chandak Points 101

Venez de découvrir ceci sur Ubuntu 14/16. Cela a parfaitement fonctionné pour moi.

Étapes (sudo implicite) :

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

0voto

user754068 Points 1

Que diriez-vous d'évaluer l'heure UTC dans un script shell? Planifiez l'exécution du script shell toutes les heures. En haut du script, obtenez l'heure UTC à partir de la commande date. Si ce n'est pas l'heure UTC que vous souhaitez, quittez.

Ce script se terminera s'il n'est pas 1h UTC.

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

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