Come si imposta il fuso orario per crontab?

53

Ho impostato la sveglia ACPI in modo che il mio portatile si riattivi ogni giorno ad una certa ora. Il fuso orario per questo è UTC. Voglio configurare i miei crontabs anche usando l'UTC in modo che si adattino all'allarme sveglia.

Come si fa?

Ho provato a modificare /etc/default/cron per includere:

TZ="UTC"

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

Qualche idea?

    
posta alj 24.07.2011 - 19:40

10 risposte

34

Ho avuto un problema simile su Trusty (14.04). Risolto impostando il fuso orario della macchina, quindi riavviando il cron servizio

  1. sudo dpkg-reconfigure tzdata : segui le istruzioni per selezionare Regione / Paese
  2. sudo service cron restart
risposta data onlyjsmith 13.10.2014 - 12:51
15

Non esiste un modo semplice per raggiungere questo obiettivo. cron usa l'ora locale. /etc/default/cron e altre specifiche TZ nel crontab specifica solo che TZ deve essere usato per i processi avviati da cron, non ha alcun impatto sul tempo di avvio.

La maggior parte delle soluzioni che ho visto riguardano un'utilità nel mezzo, quindi cron darebbe il via a qualcosa che determinerebbe il momento del calcio in UTC (es. se sai che sei preoccupato solo delle modifiche all'ora legale, fallo 2 ore prima , calcola la differenza di orario e dai un calcio in poi, dai un'occhiata a at . Per farlo, le persone spesso usano perl o python o linguaggi di scripting simili).

C'è un modo brutto di hackerarlo se lo si desidera. cron legge solo le informazioni TZ dal sistema all'avvio. Quindi, se si tratta di un server in esecuzione, è sufficiente impostare TZ su UTC, riavviare e, dopo l'avvio, impostarlo sul fuso orario locale. Puoi anche scrivere questo script.

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

    
risposta data Cookie 11.07.2012 - 19:26
9

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, l'esecuzione di date dovrebbe visualizzare l'ora UTC.

  • crea un backup

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

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

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

  • ora il fuso orario dovrebbe essere lì ora, e cron guarderà a questo.

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

    
risposta data Vinicius Egerland 08.02.2015 - 00:44
8

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

% Bl0ck_qu0te%

- citazione dalla pagina di manuale di crontab (5)

Questo mi ha permesso di specificare il tempo di esecuzione di ogni cronjob in ora locale, che ha automaticamente rappresentato l'ora legale, mentre il server è rimasto in UTC.

    
risposta data Keith Shaw 30.03.2017 - 21:12
6

OK, ho impiegato del 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.

Per prima cosa, abbiamo bisogno di avvolgere l'eseguibile di 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 puoi usare qualsiasi editor che vuoi, basta rendere il file simile a questo:

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

Crea il nuovo eseguibile del file cron:

chmod ugo+rx cron

Ora riavvia il demone cron:

service cron restart

I tuoi lavori cron ora verranno eseguiti su una pianificazione basata su UTC - TUTTAVIA, anche se il tempo di esecuzione sarà UTC, quando eseguiranno avranno il fuso orario impostato su qualsiasi cosa sia definita per il sistema. Per cambiarlo, metti questo 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
    
risposta data James Parks 10.03.2013 - 20:08
5
  1. Visualizza /etc/default/cron . Puoi impostare TZ qui per -all-crontabs e dovrebbe essere TZ=UTC iirc. Quindi il tuo metodo avrebbe dovuto funzionare.

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

    timezone-name 'time zone of the system'

    Esegui il lavoro nel fuso orario specificato. timezone-name è una stringa valida per la variabile di ambiente TZ: consultare la documentazione del proprio sistema per ulteriori dettagli. Ad esempio, "Europa / Parigi" è valido su un sistema Linux. Questa opzione gestisce correttamente le modifiche all'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 nome-fuso orario, verrà SILENTAMENTE ignorato e il lavoro verrà eseguito nel fuso orario del sistema.

risposta data Rinzwind 24.07.2011 - 19:48
4

Vedi 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 lo faresti su un sistema Red Hat. Non ho a portata di mano un sistema Ubuntu per testarlo, ma l'ho provato su Red Hat.

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

export TZ=UTC

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

Si noti che questo avrà effetto solo sul cron daemon stesso e non sui lavori che si eseguono tramite cron, quindi se si desidera che un processo cron utilizzi UTC come fuso orario, sarà necessario impostarlo anche nel lavoro stesso .

Probabilmente non puoi copiare questo errore e farlo funzionare su una scatola Ubuntu, ma qui c'è lo script di init che ho usato per testarlo su Red Hat. Troverai l'esportazione subito prima della funzione 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 $?
    
risposta data James Parks 10.03.2013 - 16:08
0

Ho appena capito questo 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
    
risposta data kintuparantu 14.02.2017 - 07:29
0

Che ne pensi di valutare il tempo di utc in uno script di shell? Pianifica lo script della shell da eseguire ogni ora. Nella parte superiore dello script ottieni l'ora UTC dal comando date. Se non è l'ora UTC desiderata, esci.

Questo script uscirà se non è 1 utc.

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

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

    
risposta data PT Huynh 21.06.2018 - 02:51

Leggi altre domande sui tag