Executar código a cada hora [fechado]

8

Preciso criar um serviço da web que seja executado a cada hora. Ele será usado para revisar dados em um banco de dados e adicionar alertas a uma tabela no mesmo banco de dados se determinadas condições forem atendidas / não atendidas. O que temos atualmente é:

Temos dispositivos finais que usam Python para reportar a um servidor virtual da Amazon Web Services (AWS). O servidor da AWS pega essas informações e as armazena em um banco de dados MySQL. O servidor da AWS é Linux executando Django e Apache. Eu preciso ser capaz de executar algum código python a cada hora para verificar os dados que foram armazenados pelos dispositivos finais. Se determinadas condições não forem atendidas, um registro será adicionado à alertstabela no banco de dados.

Inicialmente, contratamos para criar a configuração acima. Eu sou novo em Python, Django e Apache. No entanto, eu já fiz várias alterações no código Python que envia e também recebe os dados dos dispositivos finais. Eu sou um codificador que está invadindo a programação da web.

Alguém tem alguma recomendação sobre como eu posso fazer isso?

Linger
fonte
Use o Quartz-Scheduler. O link a seguir será útil. quartz-scheduler.org Tutorial quartz-scheduler.org/documentation/quartz-2.1.x/quick-start
O quartzo parece ser projetado para Java. Não estou usando Java. Eu estou usando Python / Django.
Linger

Respostas:

31

Que tal fazer um cronjob , supondo que você tenha acesso ao shell?

O daemon cron existe em praticamente qualquer sistema semelhante ao UNIX e programa comandos para serem executados com base em uma descrição em um arquivo chamado crontab .

Cada linha do arquivo contém um conjunto de campos para indicar os pontos no tempo em que um comando deve ser executado.

Sua tarefa pode ser um programa independente que executa a tarefa que você deseja realizar ou, como outra resposta sugere, uma chamada de um cliente HTTP como wget , curl ou busca para acessar um recurso da Web que executará a ação.

Se você tiver limites para quanto tempo uma solicitação pode demorar para ser veiculada, pode ser necessário mover a tarefa para um script ou programa offline que não seja executado dentro da estrutura / servidor da web.

Lars Viklund
fonte
Definitivamente, Cron foi o que acabei usando. Obrigado pela resposta. Para aqueles que não querem trabalhar com o Cron, mas desejam a mesma funcionalidade, encontrei dois serviços online que realizam trabalhos como o Cron: SetCronJob e Cronless .
Linger
17

Com o Django na AWS, eu pesquisaria o aipo .

O Celery adiciona tarefas assíncronas e inclui um agendador. Na AWS, você pode configurar o Celery para usar o Amazon Simple Queue Service como intermediário (consulte Aipo com Amazon SQS no Stack Overflow e esta postagem do blog sobre o assunto).

Você configura um agendamento de tarefas periódicas do Aipo e ele executará uma tarefa configurada de acordo com esse agendamento.

A vantagem é que você pode usar toda a configuração para executar qualquer tarefa assíncrona, descarregando tarefas pesadas do servidor da web para os trabalhadores do Aipo.

A alternativa leve é ​​apenas configurar um trabalho de crontab; você pode até configurar uma rota no seu aplicativo Django para ser chamada usando curlou wget:

* 5 * * * curl http://username:password@hostname/route_to_job
Martijn Pieters
fonte
1
+1 Uma solução muito mais refinada do que minha crontarefa simples e específica para a implementação do OP.
msanford
7

Como sua instância da AWS executa o Linux, você provavelmente pode conseguir isso como um crontrabalho .

Você pode usar o que eu chamaria de abordagem cron do Drupal, que, no caso do Django, envolve a criação de um controlador para responder a uma URL e, em seguida, executar a ação que você deseja.

Em seguida, você configura uma tarefa cron para curla URL do controlador, acionando seu script.

Isso tem a vantagem adicional de ser facilmente acessível a qualquer momento a partir de um URL: talvez um gerente impaciente deseje um relatório gerado a partir dos dados dos últimos 20 minutos.

msanford
fonte
3

Você pode procurar no APScheduler. Este é um agendador de quartzo (embora não seja tão extenso) para Python.

Essa pode ser uma alternativa muito melhor para executar scripts cron externamente para aplicativos de longa execução (por exemplo, aplicativos da web), pois é neutro em plataforma e pode acessar diretamente as variáveis ​​e funções do seu aplicativo.

Você pode encontrar uma descrição para a versão mais recente aqui: http://pypi.python.org/pypi/APScheduler/2.0.3

Há alguma documentação para instalação / implementação aqui: https://apscheduler.readthedocs.org/en/latest/

Aqui estão alguns dos recursos:

  • Nenhuma dependência externa (difícil)
  • API Segura de Segmentos
  • Excelente cobertura de teste (testado no CPython 2.5 - 2.7, 3.3, Jython 2.5.3, PyPy 1.9)
  • Mecanismos de agendamento configuráveis ​​(gatilhos):
    • Programação Cron-like
    • Planejamento atrasado de tarefas de execução única (como o comando “at” do UNIX)
    • Baseado em intervalo (execute um trabalho em intervalos de tempo especificados)
  • Vários repositórios de tarefas ativos simultaneamente:
    • RAM
    • Banco de dados simples baseado em arquivo (arquivar)
    • SQLAlchemy (qualquer RDBMS suportado funciona)
    • MongoDB
    • Redis
Anna
fonte
1

Eu acho que você pode usar algumas coisas como uma django-extensions

Site de extensões do Django

Há um módulo - trabalhos. Para mim, esta é uma ferramenta muito boa para controlar seus cronjobs.

A segunda opção é usar um Fabric e criar uma função para isso.

E eu vejo a terceira via. Use sua imaginação e conhecimento e crie uma função própria com subprocesso e sh.

Demagogo
fonte
1

A resposta mais provável aqui é que você esteja executando o crontab com a configuração padrão, o que significa que ele está exibindo o crontab SPOOL MAIS DO QUE OS ARQUIVOS.

Enquanto isso, ele também pode ser executado na AWS, pois vem com o cron pré-instalado e configurado, que permite a instalação de uma tarefa que deve ser executada a cada hora, diariamente, semanalmente ou mensalmente, além de qualquer outro período, colocando arquivos em um /etc/cron.xxxxxxdiretório conforme explicado aqui .

A configuração de um trabalho para execução horária, diária, semanal ou mensal é muito rápida. Como a questão é perguntar como executar código a cada hora , no AWS Linux, você pode criar um arquivo /etc/cron.hourly.

Aqui está a etapa em que você faz login na sua instância por meio do cliente SSH.

$ echo "/usr/bin/python -q /path/to/your/file" > application
$ sudo mv application /etc/cron.hourly/
$ sudo chown -R root /etc/cron.hourly
$ sudo chmod 2755 /etc/cron.hourly/application
$ sudo /etc/init.d/crond restart

No exemplo acima, o arquivo foi salvo e denominado 'aplicativo'. O nome realmente não importa, desde que seja único. Este é o relatório de log executando:$ sudo vim /var/log/cron

Dec 28 19:01:01 ip-xxx-xx-xx-xx CROND[20243]: (root) CMD (run-parts /etc/cron.hourly)
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20243]: starting 0anacron
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20261]: finished 0anacron
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20243]: starting application
Dec 28 19:01:02 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20323]: finished application

Como mostrado no log, a cada hora, ele começará a executar o anacron que executa o agendamento periódico de comandos que é tradicionalmente feito pelo cron e, em seguida, chama todos os outros arquivos no diretório e executa os comandos em cada arquivo.

Chetabahana
fonte