comando personalizado Django e cron
-
05-07-2019 - |
Pergunta
Eu quero o meu feitos de comando do Django para ser executado a cada minuto. No entanto, parece que python /path/to/project/myapp/manage.py mycommand
não parece trabalho, enquanto no python manage.py mycommand
diretório funciona perfeitamente.
Como posso conseguir isso? Eu uso /etc/crontab
com:
****** root python /path/to/project/myapp/manage.py mycommand
Solução
Eu acho que o problema é que cron está indo para executar seus scripts em um ambiente de "nu", para que o seu DJANGO_SETTINGS_MODULE é provável indefinido. Você pode querer envolvê-lo em um shell script que define primeiramente DJANGO_SETTINGS_MODULE
Algo parecido com isto:
#!/bin/bash
export DJANGO_SETTINGS_MODULE=myproject.settings
./manage.py mycommand
torná-lo executável (+ x chmod) e, em seguida, configurar o cron para executar o script em seu lugar.
Editar
Eu também queria dizer que você pode "modularizar" este conceito um pouco e torná-lo de tal forma que seu script aceita a gerenciar comandos como argumentos.
#!/bin/bash
export DJANGO_SETTINGS_MODULE=myproject.settings
./manage.py ${*}
Agora, seu trabalho cron pode simplesmente passar "mycommand" ou qualquer outro comando manage.py você deseja executar a partir de um trabalho cron.
Outras dicas
cd /path/to/project/myapp && python manage.py mycommand
Por encadeamento de seus comandos como esta, python não será executada a menos cd muda corretamente o diretório.
Se você quer que sua vida Django muito mais simples, usar o Django-extensões de comando dentro do seu projeto:
http://code.google.com/p/django-command-extensions /
Você vai encontrar um comando chamado "runscript" para que você simplesmente adicionar o comando para sua linha crontab:
****** root python /path/to/project/myapp/manage.py runscript mycommand
E esse script será executado com o meio ambiente contexto Django.
Isto é o que eu tenho feito recentemente em um dos meus projetos, (i manter venvs para cada projeto de trabalho i, por isso estou assumning você tem venvs)
***** /path/to/venvs/bin/python /path/to/app/manage.py command_name
Isso funcionou perfeitamente para mim.
A extensão runscript não foi bem documentada. Ao contrário dos django comandar este pode ir a qualquer lugar em seu projeto e requer uma pasta scripts. O arquivo .py requer uma função run ().
-
Se seu um script autônomo, você precisa fazer isso:
from django.conf import settings from django.core.management import setup_environ setup_environ(settings) #your code here which uses django code, like django model
-
Se seu um django comando, é mais fácil: https://coderwall.com/p/k5p6ag
Em (management / commands / exporter.py)
from django.core.management.base import BaseCommand, CommandError class Command(BaseCommand): args = '' help = 'Export data to remote server' def handle(self, *args, **options): # do something here
E, em seguida, na linha de comando:
$ python manage.py exporter
Agora, é fácil adicionar uma nova tarefa cron para um sistema Linux, usando crontab:
$ crontab -e
or $ sudo crontab -e if you need root privileges
No arquivo crontab, por exemplo, para executar este comando a cada 15 minutos, algo como isto:
# m h dom mon dow command
*/15 * * * * python /var/www/myapp/manage.py exporter