Eu tive um problema semelhante no Trusty (14.04). Resolvido definindo o fuso horário da máquina e reiniciando cron
service
-
sudo dpkg-reconfigure tzdata
- siga as instruções para selecionar Região / país -
sudo service cron restart
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?
Eu tive um problema semelhante no Trusty (14.04). Resolvido definindo o fuso horário da máquina e reiniciando cron
service
sudo dpkg-reconfigure tzdata
- siga as instruções para selecionar Região / país sudo service cron restart
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.
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.
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.
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
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.
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 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 $?
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 .
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
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