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

52

Configurei a ativação da ACPI para que meu laptop acorde em um determinado horário todas as manhãs. O fuso horário para isso é o UTC. Eu quero configurar meus crontabs também usando o UTC para que eles se encaixem no alarme de ativação.

Como você faz isso?

Eu tentei editar /etc/default/cron para incluir:

TZ="UTC"

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

Alguma idéia?

    
por alj 24.07.2011 / 19:40

10 respostas

33

Eu tive um problema semelhante no Trusty (14.04). Resolvido definindo o fuso horário da máquina e reiniciando cron service

  1. sudo dpkg-reconfigure tzdata - siga as instruções para selecionar Região / país
  2. sudo service cron restart
por onlyjsmith 13.10.2014 / 12:51
14

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

A maioria das soluções que tenho visto envolvem um utilitário no meio, então o cron iniciaria algo que determinaria quando chutar de UTC (por exemplo, se você sabe que está preocupado apenas com mudanças de horário de verão, inicie 2 horas antes , calcule a diferença de horário e dê o pontapé inicial então, dê uma olhada em at . Para fazer isso, as pessoas geralmente usam perl ou python ou linguagens de script similares).

Existe uma maneira desagradável de hackeá-lo se você quiser. O cron só lê as informações do TZ do sistema na inicialização. Então, se este é um servidor sempre em execução, você pode simplesmente configurar o 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 sintaxe @reboot do cron, que deve executar scripts após a inicialização, que soa como você pode querer.

    
por Cookie 11.07.2012 / 19:26
8

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

Se você não tiver configurado manualmente nenhum fuso horário, a execução de date deverá exibir a hora UTC.

  • crie um backup

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

    sudo rm /etc/localtime
    
  • Eu moro em Chicago, (você pode precisar mudar o caminho, usando ajuda de tecla tab), então:

    sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
    
  • Em seguida, reinicie. Quando a inicialização do sistema for executada: data

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

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

    
por Vinicius Egerland 08.02.2015 / 00:44
7

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

The CRON_TZ variable specifies the time zone specific for the cron table. The user should enter a time according to the specified time zone into the table. The time used for writing into a log file is taken from the local time zone, where the daemon is running.

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

Isso permitiu que eu especificasse o tempo para executar cada cronjob na hora local, que automaticamente respondia por DST, enquanto o servidor permanecia no UTC.

    
por Keith Shaw 30.03.2017 / 21:12
6

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

Primeiro, precisamos quebrar o executável do cron em um shell que define a variável TZ. Veja 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, apenas faça o arquivo parecer assim:

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

Tornar o novo arquivo executável do cron:

chmod ugo+rx cron

Agora, reinicie o daemon do cron:

service cron restart

Seus agendamentos agendados agora serão executados em um agendamento baseado em UTC - CONTUDO, mesmo que o tempo que eles são executados seja UTC, quando eles forem executados, terão o fuso horário configurado para o que estiver definido para o sistema. Para mudar isso, coloque isso no seu crontab antes de qualquer comando:

TZ=UTC

Assim, o seu crontab será parecido com isto:

# 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
    
por James Parks 10.03.2013 / 20:08
5
  1. Veja /etc/default/cron . Você pode definir TZ aqui para todos os crontabs e deve ser TZ=UTC iirc. Então seu método deveria ter funcionado.

  2. Dê uma olhada em 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 string válida para a variável de ambiente TZ: veja a documentação do seu sistema para mais detalhes. Por exemplo, "Europa / Paris" é válido em um sistema Linux. Essa opção manipula corretamente as alterações de horário de verão. A variável de ambiente do TZ é definida para o valor do fuso horário quando um trabalho que define essa opção é executado.

    Por favor, note que se você der um argumento de nome de fuso horário errôneo, ele será ignorado SILENCIOSAMENTE e o trabalho será executado no fuso horário do sistema.

por Rinzwind 24.07.2011 / 19:48
4

Por favor, veja 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 similar a como você faria isso em um sistema Red Hat. Eu não tenho um sistema Ubuntu útil para testar isso, mas testei na Red Hat.

Tudo o que você precisa fazer é adicionar uma linha ao script de inicialização do daemon do cron. Definir e exportar a variável de ambiente TZ, assim:

export TZ=UTC

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

Observe que isso afetará apenas o daemon do cron, e não as tarefas executadas pelo cron, portanto, se você quiser que uma tarefa do cron use o UTC como fuso horário, também precisará defini-la no próprio trabalho. .

Você provavelmente não pode copiar este verbatim e fazer com que ele funcione em uma caixa do Ubuntu, mas aqui está o script de init que eu usei para testar isso na Red Hat. Você encontrará a exportação logo antes da função 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 $?
    
por James Parks 10.03.2013 / 16:08
0

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

    
por 21.06.2018 / 02:51
0

Só percebi isso no Ubuntu 14/16. Trabalhou perfeitamente para mim.

Passos (sudo implícito):

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
    
por kintuparantu 14.02.2017 / 07:29
0

Que tal avaliar o tempo do 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 no comando date. Se não for a hora UTC desejada, saia.

Este script será encerrado se não for 1 da manhã.

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

Tags