Como você define o fuso horário para o crontab?


63

Eu configurei a ativação do ACPI para que meu laptop acorde em um determinado horário todas as manhãs. O fuso horário para isso é UTC. Quero configurar meus crontabs também usando o UTC para que eles se ajustem ao alarme de ativação.

Como você faz isso?

Eu tentei editar /etc/default/cronpara incluir:

TZ="UTC"

mas não funciona. (Eu também tentei TZ=UTCe TZ="UTC/GMT")

Alguma ideia?


11
você fez sudo service cron restartdepois da edição?
Rinzwind

11
Não ... mas eu tentei e não fez diferença.
alj 24/07


Respostas:


44

Eu tive um problema semelhante no Trusty (14.04). Solucionado, definindo o fuso horário da máquina e reiniciando o cronserviço

  1. sudo dpkg-reconfigure tzdata - siga as instruções para selecionar Região / País
  2. sudo service cron restart

11
Após definir o fuso horário, você pode digitar datena linha de comando para confirmar que a data está correta conforme sua expectativa.
mydoghasworms

Reiniciei o cron, mas ele ainda está usando o fuso horário antigo (UTC)?
Luke Fisk-Lennon

Isso funcionou perfeitamente para mim em 18.10. ~ $ date retorna a hora correta. Adorei essas interfaces GUI coloridas, do estilo DOS! Obrigado.
itsricky

18

Não há uma maneira fácil de conseguir isso. cron usa a hora local. /etc/default/crone outras TZespecificações no crontab apenas especificam o que TZdeve ser usado para os processos iniciados pelo cron, isso não afeta o horário de início.

A maioria das soluções que vi envolvem um utilitário no meio; portanto, o cron iniciaria algo que determinaria quando iniciar no UTC (por exemplo, se você sabe que está preocupado apenas com alterações no horário de verão, inicie-o 2 horas antes, calcule o diferença de fuso horário e inicie-a. Dê uma olhada at. Para fazer isso, as pessoas costumam usar perlou pythonou linguagens de script semelhantes).

Existe uma maneira desagradável de invadir, se você quiser. O cron lê apenas as informações da TZ do sistema na inicialização. Portanto, se este é um servidor em execução, você pode simplesmente definir TZ para UTC, reiniciar e, após a inicialização, configurá-lo para o fuso horário local. Você pode escrever isso também.

Como uma abordagem alternativa, também dê uma olhada na @rebootsintaxe do cron, que deve executar scripts após a inicialização, que soa como o que você pode querer.


14

Há um arquivo que controla o fuso horário do sistema. Acabei de receber o mesmo problema, eis a solução:

Se você não configurou manualmente nenhum fuso horário, a execução datedeve exibir a hora UTC.

  • criar um backup

    sudo cp /etc/localtime /etc/localtime.bkp
    
  • remova o arquivo:

    sudo rm /etc/localtime
    
  • Eu moro em Chicago, (pode ser necessário alterar o caminho, usando a tecla tab ajuda) assim:

    sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
    
  • Então reinicie. Quando a inicialização do sistema executa: date

  • agora seu fuso horário deve estar lá agora, e o cron examinará isso.

FYI: definir a variável TZ é uma solução temporária e pode funcionar como uma "máscara" às vezes.


11
+1 para uma solução compatível com CentOS (e EC2 Amazon Linux). Uma reinicialização completa pode ser uma boa ideia, mas para mim datefuncionou sem a reinicialização e a barra de reiniciar o sistema operacional sudo service crond restartfoi suficiente para corrigir meus tempos de trabalho do cron.
Davur

+1 Obrigado, está funcionando.
Jim

13

Em março de 2017, descobri que o crond suporta a variável CRON_TZ em cada crontab.

A variável CRON_TZ especifica o fuso horário específico para a tabela cron. O usuário deve inserir um horário de acordo com o fuso horário especificado na tabela. O tempo usado para gravar em um arquivo de log é obtido no fuso horário local, onde o daemon está em execução.

- citação da página de manual do crontab (5)

Isso me permitiu especificar o tempo para executar cada cronjob no horário local, que representava automaticamente o horário de verão, enquanto o servidor permanecia no UTC.


Também achei este link útil: serverfault.com/questions/848829/… . Para encontrar a opção de fuso horário que eu precisava, insirai ls /usr/share/zoneinfo/Americapara ver as opções.
cheevahagadog 13/03

7

OK, levei algum tempo e descobri como fazer isso no Ubuntu Natty, e aqui está como eu fiz funcionar. Pode haver uma maneira mais elegante, mas dessa maneira funciona.

Primeiro, precisamos envolver o executável cron em um shell que defina a variável TZ. Aqui está como:

cd /usr/sbin
mv cron cron.real

Em seguida, crie um novo arquivo / usr / sbin / cron. Eu usei o vim, mas você pode usar qualquer editor que quiser, basta fazer o arquivo ficar assim:

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

Torne o novo arquivo cron executável:

chmod ugo+rx cron

Agora, reinicie o daemon cron:

service cron restart

Seus trabalhos cron agora serão executados em uma programação baseada em UTC - NO ENTANTO, mesmo que o horário em que sejam executados seja UTC, quando executados, eles terão o fuso horário definido para o que for definido para o sistema. Para mudar isso, coloque isso no seu crontab antes de qualquer comando:

TZ=UTC

Portanto, o seu crontab será mais ou menos assim:

# 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

11
Qual é o sentido de definir TZ = UTC em dois lugares? Você não pode colocá-lo no arquivo crontab?
Ph Nng Nguyễn

Não. Colocar TZ = UTC no arquivo crontab apenas o define para os trabalhos cron, não para o próprio cron. Não afeta o tempo da execução do trabalho.
Mark Reed

5
  1. Veja /etc/default/cron. Você pode definir TZaqui para -all- crontabs e deve ser TZ=UTCiirc. Portanto, seu método deveria ter funcionado.

  2. Dê uma olhada no fcron . Você pode definir crontabs individuais em diferentes fusos horários:

    timezone-name 'time zone of the system'

    Execute o trabalho no fuso horário especificado. timezone-name é uma sequência válida para a variável de ambiente TZ: consulte a documentação do seu sistema para obter mais detalhes. Por exemplo, "Europa / Paris" é válido em um sistema Linux. Esta opção lida com as alterações do horário de verão corretamente. A variável de ambiente TZ é configurada para o valor do fuso horário quando um trabalho que define esta opção é executado.

    Observe que, se você der um argumento incorreto de nome do fuso horário, ele será ignorado silenciosamente e o trabalho será executado no fuso horário do sistema.


Bem, eu verifiquei e o crontab só funciona quando eu defino a hora do gatilho como a hora local. Definir a hora para UTC simplesmente não funciona.
24711 alj

bem 4 anos mais tarde e eu tinha uma olhada no arquivo em / etc / default / cron e este é oficialmente obsoleto agora
the0ther

Um voto negativo após 4 anos? Sim, isso é inválido agora, mas não estava de volta ao dia. Então, novamente, ninguém é mais o usuário 11.04, espero.
Rinzwind

3
Se esta resposta for inválida, você provavelmente deve excluí-la; não há sentido em manter conscientemente informações erradas no StackExchange. Que ele usou para ser on-topic e / ou correto é praticamente irrelevante para quem visita esta página em busca de informações corretas.
Quuxplusone

4

Por favor, veja o meu próximo post para uma solução específica do Ubuntu

Eu sei que este é um fórum do Ubuntu, mas acredito que a resposta será muito semelhante a como você faria isso em um sistema Red Hat. Não tenho um sistema Ubuntu à mão para testar isso, mas testei no Red Hat.

Tudo o que você precisa fazer é adicionar uma linha ao script init do cron daemon. Defina e exporte a variável de ambiente TZ, assim:

export TZ=UTC

Em seguida, reinicie seu daemon cron. Certifique-se de colocar essa exportação no script de início do daemon cron APÓS qualquer outra configuração e fonte de variáveis ​​- acho que talvez seja por isso que a edição do /etc/default/cronscript original do pôster não funcionou para ele. Talvez ele tenha definido, mas foi redefinido por algo mais adiante no script.

Observe que isso afetará apenas o próprio daemon cron, e não os trabalhos executados via cron, portanto, se você quiser que um trabalho cron use o UTC como fuso horário, será necessário configurá-lo também no trabalho.

Você provavelmente não pode copiar esse texto literalmente e fazê-lo funcionar em uma caixa Ubuntu, mas aqui está o script init que usei para testar isso no Red Hat. Você encontrará a exportação logo antes da start()função:

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

Acabei de descobrir isso no Ubuntu 14/16. Funcionou perfeitamente para mim.

Etapas (sudo implícitas):

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

Que tal avaliar o tempo utc em um script de shell? Agende o script de shell para ser executado a cada hora. Na parte superior do script, obtenha a hora UTC do comando date. Se não for a hora UTC desejada, saia.

Este script será encerrado se não for 01:00 utc.

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

0

Você pode definir a variável de ambiente CRON_TZ Se a tarefa cron for executada em um servidor remoto, você provavelmente deve notar que o shell usado pelo crontab é sh . Você pode verificar duas vezes em / etc / crontab .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.