web-dev-qa-db-fra.com

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

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é 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?

62
alj

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 le service cron

  1. Sudo dpkg-reconfigure tzdata - suivez les instructions pour sélectionner Région/Pays
  2. Sudo service cron restart
42
onlyjsmith

Il n'y a pas de moyen facile d'y parvenir. cron utilise l'heure locale. /etc/default/cron et d'autres TZdans la crontab spécifient simplement quel 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 n'êtes préoccupé que par les modifications de l'heure d'été, lancez-le 2 heures avant, calculez la Regardez alors atname__. Pour ce faire, les gens utilisent souvent Perlou pythonou 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 aussi écrire ceci.

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

17
Cookie

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 au format UTC.

12
Keith Shaw

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 configuré manuellement aucun fuseau horaire, l'exécution de 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), donc:

    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".

12
Vinicius Egerland

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.

Premièrement, nous avons besoin d’envelopper l’exécutable cron dans un shell qui définit 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 vont maintenant être 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
7
James Parks
  1. Voir /etc/default/cron. Vous pouvez définir TZ ici pour -all-crontabs. Il devrait s'agir de TZ=UTC iirc. 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 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.

5
Rinzwind

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 cela explique peut-être pourquoi la modification du script /etc/default/cron par l’affiche originale ne fonctionne pas. Peut-être l'a-t-il défini, mais il a ensuite été réinitialisé par quelque chose de 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 $?
4
James Parks

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 /etc/crontab .

0
PT Huynh

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
user754068

Je viens de comprendre cela sur Ubuntu 14/16. 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
0
Varun Chandak