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 à alerts
tabela 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?
fonte
Respostas:
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.
fonte
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
curl
ouwget
:fonte
cron
tarefa simples e específica para a implementação do OP.Como sua instância da AWS executa o Linux, você provavelmente pode conseguir isso como um
cron
trabalho .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
curl
a 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.
fonte
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:
fonte
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.
fonte
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.xxxxxx
diretó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.
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
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.
fonte