Estou procurando uma biblioteca em Python que forneça at
e cron
gere funcionalidade.
Eu gostaria de ter uma solução Python pura, em vez de confiar nas ferramentas instaladas na caixa; desta forma eu corro em máquinas sem cron.
Para aqueles que não estão familiarizados com cron
: você pode agendar tarefas com base em uma expressão como:
0 2 * * 7 /usr/bin/run-backup # run the backups at 0200 on Every Sunday
0 9-17/2 * * 1-5 /usr/bin/purge-temps # run the purge temps command, every 2 hours between 9am and 5pm on Mondays to Fridays.
A sintaxe da expressão cron time é menos importante, mas eu gostaria de ter algo com esse tipo de flexibilidade.
Se não houver algo que faça isso imediatamente, todas as sugestões para os blocos de construção para fazer algo assim serão recebidas com gratidão.
Editar Não estou interessado em iniciar processos, apenas "trabalhos" também escritos nas funções Python - python. Por necessidade, acho que esse seria um segmento diferente, mas não em um processo diferente.
Para esse fim, procuro a expressividade da expressão cron time, mas em Python.
Cron existe há anos, mas estou tentando ser o mais portátil possível. Não posso confiar na presença dele.
fonte
Respostas:
Se você estiver procurando por algo leve na agenda de checkout :
Divulgação : sou o autor dessa biblioteca.
fonte
schedule
. Isso funcionou bem para mim. Seria ainda melhor se tivesse cron como sintaxe e decoradores suportados (consulte o crython, mas não use esta biblioteca porque não funciona; o agendamento não parece estar bem escrito).do()
função encaminha argumentos extras que você passa para a função de trabalho: schedule.readthedocs.io/en/stable/api.html#schedule.Job.do Por exemplo, você pode fazer isso :schedule.every().hour.do(job, param1, param2)
Não há necessidade de usar um lambda. Espero que isso ajude :)Você pode usar o argumento normal do Python passando a sintaxe para especificar seu crontab. Por exemplo, suponha que definimos uma classe Event como abaixo:
(Nota: Não testado completamente)
Em seguida, seu CronTab pode ser especificado na sintaxe python normal como:
Dessa forma, você obtém todo o poder da mecânica de argumentos do Python (misturando argumentos posicionais e de palavras-chave e pode usar nomes simbólicos para nomes de semanas e meses)
A classe CronTab seria definida como simplesmente dormir em incrementos de minutos e chamar check () em cada evento. (Provavelmente existem algumas sutilezas com o horário de verão / fusos horários para se ter cuidado). Aqui está uma implementação rápida:
Algumas coisas a serem observadas: os dias da semana / meses do Python são zero indexados (diferente do cron), e esse intervalo exclui o último elemento; portanto, sintaxe como "1-5" se torna intervalo (0,5) - ou seja, [0,1,2, 3,4] Se você preferir a sintaxe do cron, a análise não deve ser muito difícil.
fonte
pip install anything
:)talvez isso tenha surgido somente depois que a pergunta foi feita; Eu pensei em mencioná-lo por uma questão de integridade: https://apscheduler.readthedocs.org/en/latest/
fonte
Uma coisa que nas minhas pesquisas que vi é o
sched
módulo python, que pode ser o tipo de coisa que você está procurando.fonte
"... módulo Crontab para ler e gravar arquivos crontab e acessar o cron do sistema automaticamente e simplesmente usando uma API direta. ..."
http://pypi.python.org/pypi/python-crontab
e também o APScheduler, um pacote python. Já está escrito e depurado.
http://packages.python.org/APScheduler/cronschedule.html
fonte
Mais ou menos o mesmo que acima, mas simultaneamente usando gevent :)
fonte
Nenhuma das soluções listadas sequer tenta analisar uma sequência complexa de cronograma cron. Então, aqui está a minha versão, usando croniter . Essência básica:
Rotinas auxiliares:
fonte
elif
? Atm Estou usando uma programação como essa"* * * * *"
, adicionandotime.sleep
mais de 1 minuto na seção "Faça sua coisa periódica"if
, mas sempre vejo as coisas nessa instrução if. Quando leva mais de 1 minuto, vejo o loop while pulando a execução do loop ausente.Eu modifiquei o script.
Fácil de usar:
Tente iniciar a tarefa no primeiro segundo de um minuto.
Código no Github
fonte
Eu tenho uma pequena correção para o método de execução de classe CronTab sugerido por Brian .
O tempo terminou em um segundo, levando a um ciclo difícil de um segundo no final de cada minuto.
fonte
Não existe uma maneira "python pura" de fazer isso, porque algum outro processo teria que iniciar o python para executar sua solução. Cada plataforma terá uma ou vinte maneiras diferentes de iniciar processos e monitorar seu progresso. Em plataformas unix, o cron é o padrão antigo. No Mac OS X, também existe o launchd, que combina o lançamento do tipo cron com a funcionalidade watchdog que pode manter seu processo ativo, se é isso que você deseja. Depois que o python estiver em execução, você poderá usar o módulo de agendamento para agendar tarefas.
fonte
Sei que há muitas respostas, mas outra solução poderia ser a de decoradores . Este é um exemplo para repetir uma função todos os dias em um horário específico. O melhor de usar dessa maneira é que você só precisa adicionar o Sugar Syntactic Sugar à função que deseja agendar:
E o decorador terá a seguinte aparência:
fonte
A solução de Brian está funcionando muito bem. No entanto, como outros já apontaram, há um bug sutil no código de execução. Também achei excessivamente complicado para as necessidades.
Aqui está minha alternativa mais simples e funcional para o código de execução, caso alguém precise:
fonte
Outra solução trivial seria:
E a classe aqcron.At é:
fonte
Se você estiver procurando por um agendador distribuído, consulte https://github.com/sherinkurian/mani - ele precisa de redis, embora possa não ser o que você está procurando. (observe que eu sou o autor) isso foi criado para garantir a tolerância a falhas, com o relógio sendo executado em mais de um nó.
fonte
Não sei se algo assim já existe. Seria fácil escrever seu próprio com módulos de hora, data e hora e / ou calendário, consulte http://docs.python.org/library/time.html
A única preocupação para uma solução python é que as suas necessidades de trabalho para estar sempre em execução e, possivelmente, ser automaticamente "ressuscitado" após uma reinicialização, algo para o qual você fazer necessidade de contar com soluções dependentes do sistema.
fonte
Você pode conferir os [1] Crons do PiCloud [2], mas observe que seus trabalhos não serão executados em sua própria máquina. Também é um serviço que você precisará pagar se usar mais de 20 horas de computação por mês.
[1] http://www.picloud.com
[2] http://docs.picloud.com/cron.html
fonte
Método do Crontab no servidor.
Nome do arquivo Python hello.py
Etapa 1: Crie um arquivo sh, deixe o nome s.sh
Etapa 2: Abrir o Crontab Editor
Etapa 3: adicionar horário da programação
Use a formatação Crontab
Este cron será executado "No minuto 2."
fonte
Eu gosto de como o pacote pycron resolve esse problema.
fonte