Come si imposta il fuso orario per crontab?


63

Ho impostato la sveglia ACPI in modo che il mio laptop si svegli ad una certa ora ogni mattina. Il fuso orario per questo è UTC. Voglio impostare i miei crontab anche usando UTC in modo che si adattino all'allarme di sveglia.

Come si fa?

Ho provato a modificare /etc/default/cronper includere:

TZ="UTC"

ma non funziona. (Ho anche provato TZ=UTCe TZ="UTC/GMT")

Qualche idea?


1
hai fatto una sudo service cron restartmodifica dopo?
Rinzwind,

1
No ... ma l'ho provato e non ha fatto differenza.
alj


Risposte:


45

Ho avuto un problema simile su Trusty (14.04). Risolto impostando il fuso orario della macchina e riavviando il cronservizio

  1. sudo dpkg-reconfigure tzdata - seguire le istruzioni per selezionare Regione / Paese
  2. sudo service cron restart
  3. timedatectl - Verifica le impostazioni della data

1
Dopo aver impostato il fuso orario, è possibile digitare datedalla riga di comando per confermare che la data è corretta secondo le proprie aspettative.
mydoghasworms,

Ho riavviato cron, ma sta ancora usando il vecchio fuso orario (UTC)?
Luke Fisk-Lennon,

Questo ha funzionato senza problemi per me il 18.10. ~ $ date restituisce l'ora corretta. Devi amare quelle interfacce GUI colorate in stile DOS! Grazie.
veloce

18

Non esiste un modo semplice per raggiungere questo obiettivo. cron utilizza l'ora locale. /etc/default/crone altre TZspecifiche nel crontab specificano solo cosa TZdovrebbe essere usato per i processi avviati da cron, non influisce sull'ora di inizio.

La maggior parte delle soluzioni che ho visto coinvolgono un'utilità nel mezzo, quindi cron darebbe il via a qualcosa che determinerebbe quindi quando dare il via in UTC (ad esempio se sai che sei preoccupato solo per le modifiche dell'ora legale, avvialo 2 ore prima, calcola il differenza di fuso orario e poi dare il via. Dai un'occhiata at. Per fare ciò, le persone usano spesso perlo pythono linguaggi di scripting simili).

C'è un modo brutto per hackerarlo se lo desideri. cron legge solo le informazioni TZ dal sistema all'avvio. Quindi, se questo è un server sempre in esecuzione, potresti semplicemente impostare TZ su UTC, riavviare e dopo l'avvio impostarlo sul fuso orario locale. Potresti anche scrivere questo.

Come approccio alternativo, dai un'occhiata anche alla @rebootsintassi di cron, che dovrebbe eseguire gli script dopo l'avvio, che suona come quello che potresti desiderare.


14

C'è un file che controlla il fuso orario del sistema .. Ho appena avuto lo stesso problema, ecco la soluzione:

Se non hai configurato manualmente alcun fuso orario, in esecuzione datedovrebbe visualizzare l'ora UTC.

  • creare un backup

    sudo cp /etc/localtime /etc/localtime.bkp
    
  • rimuovere il file:

    sudo rm /etc/localtime
    
  • Vivo a Chicago, (potrebbe essere necessario modificare il percorso, utilizzando il tasto Tab aiuta) quindi:

    sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
    
  • Quindi riavviare. Quando viene eseguito l'avvio del sistema: data

  • ora il tuo fuso orario dovrebbe essere lì adesso, e cron lo guarderà.

Cordiali saluti: l'impostazione della variabile TZ è una soluzione temporanea e talvolta può fungere da "maschera".


1
+1 per una soluzione compatibile CentOS (e EC2 Amazon Linux). Un riavvio completo può essere una buona idea, ma per me ha datefunzionato senza riavviare e il riavvio del sistema operativo della barra è sudo service crond restartstato sufficiente per correggere i tempi del mio cron job.
David,

+1 Grazie sta funzionando.
Jim,

13

A partire da marzo 2017, ho scoperto che crond supporta la variabile CRON_TZ in ogni crontab.

La variabile CRON_TZ specifica il fuso orario specifico per la tabella cron. L'utente deve inserire un orario in base al fuso orario specificato nella tabella. Il tempo utilizzato per la scrittura in un file di registro è tratto dal fuso orario locale, dove è in esecuzione il daemon.

- citazione dalla pagina man di crontab (5)

Ciò mi ha permesso di specificare l'ora in cui eseguire ogni cronjob in ora locale, che rappresentava automaticamente l'ora legale, mentre il server rimaneva in UTC.


Ho anche trovato utile questo link: serverfault.com/questions/848829/… . Per trovare l'opzione del fuso orario di cui avevo bisogno sono entrato ls /usr/share/zoneinfo/Americaper vedere le opzioni.
cheevahagadog,

7

OK, ho impiegato un po 'di tempo e ho capito come farlo su Ubuntu Natty, ed ecco come l'ho fatto funzionare. Potrebbe esserci un modo più elegante, ma funziona in questo modo.

Innanzitutto, dobbiamo avvolgere l'eseguibile cron in una shell che imposta la variabile TZ. Ecco come:

cd /usr/sbin
mv cron cron.real

Quindi, crea un nuovo file / usr / sbin / cron. Ho usato vim, ma è possibile utilizzare qualsiasi editor desiderato, basta fare in modo che il file sia simile al seguente:

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

Rendi eseguibile il nuovo file cron:

chmod ugo+rx cron

Ora riavvia il demone cron:

service cron restart

I tuoi lavori cron verranno ora eseguiti su una pianificazione basata su UTC - TUTTAVIA, anche se il tempo in cui vengono eseguiti sarà UTC, quando eseguiranno avranno il fuso orario impostato su qualsiasi cosa sia definita per il sistema. Per cambiarlo, inseriscilo nel tuo crontab prima di qualsiasi comando:

TZ=UTC

Quindi il tuo crontab sarà simile a questo:

# 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
Qual è lo scopo di impostare TZ = UTC in due punti? Non puoi semplicemente inserirlo nel file crontab?
Phương Nguyễn,

No. L'inserimento di TZ = UTC nel file crontab lo imposta solo per i lavori cron, non per cron stesso. Non influisce sui tempi di esecuzione del lavoro.
Mark Reed,

5
  1. Vedere /etc/default/cron. Puoi impostare TZqui per -all-crontabs e dovrebbe essere TZ=UTCiirc. Quindi il tuo metodo avrebbe dovuto funzionare.

  2. Dai un'occhiata a fcron . Puoi impostare singoli crontab in diversi fusi orari:

    timezone-name 'time zone of the system'

    Eseguire il lavoro nel fuso orario specificato. timezone-name è una stringa valida per la variabile di ambiente TZ: consultare la documentazione del proprio sistema per maggiori dettagli. Ad esempio, "Europa / Parigi" è valido su un sistema Linux. Questa opzione gestisce correttamente le modifiche dell'ora legale. La variabile di ambiente TZ è impostata sul valore del fuso orario quando viene eseguito un lavoro che definisce questa opzione.

    Si noti che se si fornisce un argomento errato sul nome del fuso orario, questo verrà SILENTAMENTE ignorato e il lavoro verrà eseguito nel fuso orario del sistema.


Bene, l'ho controllato e il crontab funziona solo quando imposto l'ora del trigger come ora locale. L'impostazione dell'ora su UTC non funziona.
alj

bene 4 anni dopo e ho dato una sbirciatina al file in / etc / default / cron e questo è ufficialmente deprecato ora
the0ther

Un downvote dopo 4 anni? Sì, questo non è valido ora, ma non era nel passato. Quindi di nuovo nessuno è più l'utente 11.04, spero.
Rinzwind,

3
Se questa risposta non è valida, probabilmente dovresti eliminarla; non ha senso mantenere consapevolmente disinformazione su StackExchange. Che usato per essere in argomento e / o corretta è praticamente irrilevante per chiunque voglia visitare questa pagina in cerca di informazioni corrette.
Quuxplusone,

4

Si prega di consultare il mio prossimo post per una soluzione specifica per Ubuntu

So che questo è un forum di Ubuntu, ma credo che la risposta sarà molto simile a come si farebbe su un sistema Red Hat. Non ho un sistema Ubuntu a portata di mano per testarlo, ma l'ho provato su Red Hat.

Tutto quello che devi fare è aggiungere una riga allo script init del demone cron. Imposta ed esporta la variabile di ambiente TZ, in questo modo:

export TZ=UTC

Quindi riavvia il tuo demone cron. Assicurati di inserire questa esportazione nello script di avvio del demone cron DOPO qualsiasi altra impostazione e sorgente di variabili - penso che questo potrebbe essere il motivo per cui la modifica del poster originale dello /etc/default/cronscript non ha funzionato per lui. Forse l'ha impostato, ma è stato ripristinato da qualcos'altro più in basso nella sceneggiatura.

Si noti che ciò influirà solo sul demone cron stesso e non sui lavori eseguiti tramite cron, quindi se si desidera che un lavoro cron utilizzi UTC come fuso orario, è necessario impostarlo anche nel lavoro stesso.

Probabilmente non puoi copiarlo alla lettera e farlo funzionare su un box Ubuntu, ma ecco lo script di init che ho usato per testarlo su Red Hat. Troverai l'esportazione subito prima della start()funzione:

#!/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

L'ho appena scoperto su Ubuntu 14/16. Ha funzionato perfettamente per me.

Passaggi (sudo implicito):

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

Che dire della valutazione del tempo utc in uno script di shell? Pianifica l'esecuzione dello script della shell ogni ora. Nella parte superiore dello script ottieni l'ora UTC dal comando date. Se non è l'ora UTC desiderata, esci.

Questo script verrà chiuso se non è 1am utc.

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

0

È possibile impostare la variabile di ambiente CRON_TZ Se il processo cron viene eseguito su un server remoto, probabilmente dovresti notare che la shell utilizzata da crontab è sh . Puoi ricontrollare / etc / crontab .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.