Estou tentando executar um comando de gerenciamento do Django a partir do cron. Estou usando o virtualenv para manter meu projeto em área restrita.
Eu vi exemplos aqui e em outros lugares que mostram a execução de comandos de gerenciamento de dentro do virtualenv, como:
0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg
No entanto, embora o syslog mostre uma entrada quando a tarefa deveria ter sido iniciada, ela nunca é executada (o arquivo de log do script está vazio). Se eu executar a linha manualmente a partir do shell, ela funcionará conforme o esperado.
Atualmente, a única maneira de obter o comando para executar via cron é dividir os comandos e colocá-los em um script de invólucro bash idiota:
#!/bin/sh
source /home/user/project/env/bin/activate
cd /home/user/project/
./manage.py command arg
EDITAR:
O ars surgiu com uma combinação de comandos de trabalho:
0 3 * * * cd /home/user/project && /home/user/project/env/bin/python /home/user/project/manage.py command arg
Pelo menos no meu caso, invocar o script de ativação para o virtualenv não fez nada. Isso funciona, assim por diante com o show.
fonte
env
eexport
todos eles em um wrapper de script bash que você chama no crontab.Respostas:
Você deve conseguir fazer isso usando o
python
em seu ambiente virtual:EDIT: Se o seu projeto django não estiver no PYTHONPATH, será necessário mudar para o diretório certo:
Você também pode tentar registrar a falha no cron:
Outra coisa a tentar é fazer a mesma alteração no seu
manage.py
script no topo:fonte
~
pelo caminho completo? (Você provavelmente fez, apenas ter certeza ...)A execução
source
de um cronfile não funcionará como o cron usa/bin/sh
como seu shell padrão, o que não suportasource
. Você precisa definir a variável de ambiente SHELL para/bin/bash
:É difícil identificar por que isso falha, pois
/var/log/syslog
não registra os detalhes do erro. É melhor fazer o apelido de root para receber e-mails com quaisquer erros do cron. Basta adicionar-se/etc/aliases
e executarsendmail -bi
.Mais informações aqui: http://codeinthehole.com/archives/43-Running-django-cronjobs-within-a-virtualenv.html
o link acima foi alterado para: https://codeinthehole.com/tips/running-django-cronjobs-within-a-virtualenv/
fonte
. /path/to/virtualenv/bin/activate
postactivate
arquivo, você deveria fazer issosource /path/to/virtualenv/bin/activate && source /path/to/virtualenv/bin/postactivate
Não procure mais:
Abordagem genérica:
A beleza disso é que você NÃO precisa alterar a
SHELL
variável do crontab desh
parabash
fonte
A única maneira correta de executar tarefas cron do python ao usar um virtualenv é ativar o ambiente e, em seguida, executar o python do ambiente para executar seu código.
Uma maneira de fazer isso é usar virtualenv's
activate_this
em seu script python, consulte: http://virtualenv.readthedocs.org/en/latest/userguide.html#using-virtualenv-without-bin-pythonOutra solução é repetir o comando completo, incluindo ativar o ambiente e canalizá-lo
/bin/bash
. Considere isto para o seu/etc/crontab
:fonte
Em vez de mexer com shebangs específicos de virtualvv, basta colocar
PATH
o crontab.Em um virtualenv ativado, execute esses três comandos e os scripts python devem funcionar:
A primeira linha do crontab deve ficar assim:
fonte
A melhor solução para mim foi tanto
man python
menciona modificar o caminho no shell em$PYTHONPATH
ou em python comsys.path
Outras respostas mencionam idéias para fazer isso usando o shell. No python, adicionar as seguintes linhas ao meu script me permite executá-lo com êxito diretamente do cron.
Veja como fica em uma sessão interativa -
fonte
Eu gostaria de adicionar isso porque passei algum tempo resolvendo o problema e não encontrei uma resposta aqui para combinar o uso de variáveis no cron e no virtualenv. Então, talvez isso ajude alguém.
Não funcionou bem quando foi configurado como
Obrigado @davidwinterbottom , @ reed-sandberg e @mkb por dar a direção certa. A resposta aceita realmente funciona bem até que seu python precise executar um script que precise executar outro binário python do diretório venv / bin.
fonte
Esta é uma solução que funcionou bem para mim.
Estou usando o miniconda com Conda versão 4.7.12 em um Ubuntu 18.04.3 LTS.
Sou capaz de colocar o que precede dentro de um script e executá-lo via crontab também sem nenhum problema.
fonte
fonte