Uma substituição de cron que lida com vários fusos horários

8

Estou procurando uma substituição do cron (ou um método no cron, se possível) que permita o agendamento de trabalhos em qualquer número de fusos horários (especificamente mais de um por usuário / arquivo). O que eu gostaria é a capacidade de especificar um fuso horário por trabalho (ou linha cron) e especificar apenas horários nos fusos horários locais. Percebo que posso alterar todo o fuso horário em que o cron é executado, mas no final do dia ele pode ser executado apenas em um fuso horário.

Minha solução atual é converter todos os meus horários para GMT e executar tarefas de acordo, o único problema ocorre durante as semanas de mudança de horário de verão. Muitas edições manuais devem ser feitas para garantir que as coisas funcionem corretamente no respectivo fuso horário local (por exemplo, alguns regiões não seguem o horário de verão ou não são alteradas na mesma data).

Alguma idéia sobre isso?

mgray
fonte

Respostas:

3

Eu acho que você está tentando ter os dois lados e a realidade é que você simplesmente não pode. Se você deseja que um trabalho seja executado às 8h no horário local, por exemplo, independentemente de o horário de verão estar ativo, execute o sistema (e o cron) no horário local e não faça edições sazonais ou no UTC ( GMT) e faça edições sazonais. Se você deseja que seus trabalhos sejam executados no mesmo UTC, independentemente , execute o cron de acordo com o UTC e não há mais nada a fazer.

Se o que você deseja é que um usuário possa agendar um trabalho cron de acordo com o fuso horário local e não precisar que ele pense em conversões para sua conveniência , escreva um script de conversão que aceite uma especificação cron e um fuso horário. faz a conversão para o UTC nos bastidores e edita o crontab para ele. Pode até ser uma conversão bidirecional para lidar com alterações nas entradas existentes.

Será útil se você nos contar o que realmente está tentando realizar .

Pausado até novo aviso.
fonte
6

O fcron suporta esse recurso.

Na documentação da opção "fuso horário" no fcrontab (5) :

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.

jroller
fonte
fcronparece ser bastante antigo e não possui instalação padrão no ubuntu. existe alguma outra solução?
silgon
Parece que fcron foi removido do Debian em 2011 devido a ser "quebrado e ultrapassada" :(
Peter Green
3

Você pode escrever para si mesmo um pequeno invólucro que leva três argumentos:

  • Segmente a hora do fuso horário para corresponder
  • Fuso horário alvo
  • Comando para executar se o destino tz hora corresponder à hora atual (no destino tz).

Em seguida, basta colocar a linha do invólucro no seu crontab para executar a cada hora:

python tz_wrapper.py 14 "US/Mountain" "echo 'hi'"

Versão python simples:

#!/usr/bin/python
import sys, os, datetime
import pytz

arg_hour = sys.argv[1]
arg_timezone = sys.argv[2]
arg_cmd = sys.argv[3]

target_tz = pytz.timezone(arg_timezone)
target_hour = pytz.utc.localize(datetime.datetime.utcnow()).astimezone(target_tz).strftime("%H")

if target_hour == str(arg_hour):
    os.system(arg_cmd)
jasonjwwilliams
fonte
0

Eu recomendo que você use o Horário Universal Coordenado (UTC), isso não é afetado pelo horário de verão. Veja as respostas para "horário de inverno e verão sem interrupção na linha do tempo". . Isso é o que geralmente é melhor para a hora do sistema também.

Kyle Brandt
fonte
Suponho que não tenha esclarecido minha pergunta o suficiente ... Meu problema é que preciso que os trabalhos sejam executados às 8:00, horário local, em uma região (por exemplo, África do Sul / Joanesburgo). Quando o horário de verão ocorre, o deslocamento do UTC acabará sendo alterado para incluir a nova hora local e exigirá uma edição manual para contabilizar isso. Isso faz sentido, ou estou faltando alguma coisa aqui?
Mgray
Veja o que disse Dennis, ele está certo :-)
Kyle Brandt
0

Existe um porto de lançamento do darwin para o FreeBSD que fará tudo o que você quiser se estiver no FreeBSD.

https://github.com/freebsd/openlaunchd

E existe o jobd, que é para * BSD e Linux.

https://github.com/mheily/jobd

lbutlr
fonte
11
É possível compartilhar a parte da configuração ou link em que é possível ver como configurar o fuso horário para um determinado trabalho?
silgon
-1

Cfengine é a maneira como fazemos isso. Você pode configurar trabalhos usando a hora local (que se adapta ao horário de verão) ou GMT para trabalhos simultâneos. Você pode criar qualquer tipo de calendário personalizado, com exceções. Sei que você pode pagar uma tonelada de dinheiro pelo agendamento de software, mas nunca precisávamos de nada além disso, mesmo com datacenters em três locais ao redor do mundo.

SAnnukka
fonte