Eu tenho um ambiente virtual Anaconda Python configurado e se eu executar meu projeto enquanto esse ambiente virtual estiver ativado, tudo funciona muito bem.
Mas eu tenho um cronjob configurado para executá-lo a cada hora. Eu canalizei a saída para um log porque não estava sendo executado corretamente.
crontab -e
:
10 * * * * bash /work/sql_server_etl/src/python/run_parallel_workflow.sh >> /home/etlservice/cronlog.log 2>&1
Eu recebo este erro no cronlog.log:
Traceback (most recent call last):
File "__parallel_workflow.py", line 10, in <module>
import yaml
ImportError: No module named yaml
Isso é indicativo de que o cronjob de alguma forma não está executando o arquivo sem o ambiente virtual ativado.
Para remediar isso, adicionei uma linha ao /home/user/.bash_profile
arquivo:
conda activate ~/anaconda3/envs/sql_server_etl/
Agora quando entro o ambiente é ativado automaticamente.
No entanto, o problema persiste.
Eu tentei mais uma coisa. Alterei o cronjob (e também tentei isso no arquivo bash que o cronjob executa) para ativar explicitamente manualmente o ambiente toda vez que ele é executado, mas sem sucesso:
10 * * * * conda activate ~/anaconda3/envs/sql_server_etl/ && bash /work/sql_server_etl/src/python/run_parallel_workflow.sh >> /home/etlservice/cronlog.log 2>&1
Claro, nada que eu tentei resolveu. Eu realmente não sei nada sobre linux, então talvez haja algo óbvio que eu precise mudar.
Então, existe alguma maneira de especificar que o cronjob deve ser executado em um ambiente virtual?
Postei uma solução funcional (no Ubuntu 18.04) com um raciocínio detalhado sobre SO .
A forma curta é:
1. Copie o trecho anexado pelo Anaconda em
~/.bashrc
(no final do arquivo) para um arquivo separado~/.bashrc_conda
A partir da instalação do Anaconda 2020.02, o trecho é o seguinte:
Certifique-se de que:
/home/USERNAME/anaconda3/
está correto.~/.bashrc_conda
(e nenhum outro usuário pode gravar neste arquivo).2.
crontab -e
Adicione linhas para executar cronjobsbash
e para fonte~/.bashrc_conda
Execute
crontab -e
e insira o seguinte antes do cronjob :3.
crontab -e
Inclua no início do cronjobconda activate my_env;
como no exemploExemplo de entrada para um script que seria executado ao meio-dia 12:30 todos os dias no interpretador Python dentro do ambiente conda:
E é isso.
Você pode querer verificar de tempos em tempos se o snippet em
~/.bashrc_conda
está atualizado caso o conda atualize seu snippet em~/.bashrc
.Resposta encontrada no stack over flow:
https://stackoverflow.com/questions/3287038/cron-and-virtualenv
A solução é referenciar o executável python dentro do próprio ambiente virtual. No meu caso, alterei o arquivo bash para executar este executável:
/home/etlservice/anaconda3/envs/sql_server_etl/bin/python
Esta é uma solução que funcionou bem para mim.
Estou usando o miniconda com o Conda versão 4.7.12 em um Ubuntu 18.04.3 LTS.
Eu sou capaz de colocar o acima dentro de um script e executá-lo via crontab também sem nenhum problema.
Tente usar
source /path/to/conda/bin/activate my_env
ao invés de
conda activate my_env
em seu script bash
run_parallel_workflow.sh
.