Leg*_*ack 14 linux cron python3
我设置了一个 Anaconda Python 虚拟环境,如果我在激活该虚拟环境时运行我的项目,一切运行良好。
但是我有一个配置为每小时运行一次的 cronjob。我将输出通过管道传输到日志,因为它没有正确运行。
crontab -e:
10 * * * * bash /work/sql_server_etl/src/python/run_parallel_workflow.sh >> /home/etlservice/cronlog.log 2>&1
Run Code Online (Sandbox Code Playgroud)
我在 cronlog.log 中收到此错误:
Traceback (most recent call last):
File "__parallel_workflow.py", line 10, in <module>
import yaml
ImportError: No module named yaml
Run Code Online (Sandbox Code Playgroud)
这表明在没有激活虚拟环境的情况下,cronjob 以某种方式不运行文件。
为了解决这个问题,我在/home/user/.bash_profile文件中添加了一行:
conda activate ~/anaconda3/envs/sql_server_etl/
Run Code Online (Sandbox Code Playgroud)
现在,当我登录时,环境会自动激活。
但是,问题仍然存在。
我又尝试了一件事。我更改了 cronjob,(我也在 cronjob 运行的 bash 文件中尝试了这个)以在每次运行时明确手动激活环境,但无济于事:
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
Run Code Online (Sandbox Code Playgroud)
当然,我试过的任何东西都没有修复它。我真的对 linux 一无所知,所以也许我需要改变一些明显的东西。
那么,无论如何要指定 cronjob 应该在虚拟环境下运行?
Jea*_*net 11
发布了一个有效的解决方案(在 Ubuntu 18.04 上),并在 SO 上进行了详细的推理。
简短的形式是:
~/.bashrc(文件末尾)附加的代码段复制到单独的文件中~/.bashrc_conda从 Anaconda 2020.02 安装开始,代码片段如下:
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/USERNAME/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/home/USERNAME/anaconda3/etc/profile.d/conda.sh" ]; then
. "/home/USERNAME/anaconda3/etc/profile.d/conda.sh"
else
export PATH="/home/USERNAME/anaconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<
Run Code Online (Sandbox Code Playgroud)
确保:
/home/USERNAME/anaconda3/是正确的。~/.bashrc_conda(并且没有其他用户可以对这个文件写)。crontab -e添加行来运行 cronjobsbash和源~/.bashrc_conda在 cronjob 之前运行crontab -e并插入以下内容:
SHELL=/bin/bash
BASH_ENV=~/.bashrc_conda
Run Code Online (Sandbox Code Playgroud)
crontab -ecronjob 的开头包含conda activate my_env;示例每天中午 12:30 在 conda 环境中的 Python 解释器上执行的脚本的条目示例:
30 12 * * * conda activate my_env; python /path/to/script.py; conda deactivate
Run Code Online (Sandbox Code Playgroud)
就是这样。
您可能需要不时地检查时,在该片段~/.bashrc_conda是最新的情况下,畅达更新其片段中~/.bashrc。
小智 6
这是一个对我来说效果很好的解决方案。
source /root/miniconda3/etc/profile.d/conda.sh && \
conda activate <your_env> && \
python <your_application> &
Run Code Online (Sandbox Code Playgroud)
我在 Ubuntu 18.04.3 LTS 上使用 miniconda 和 Conda 版本 4.7.12。
我可以将上述内容放入脚本中并通过 crontab 运行它,没有任何问题。