django 从Azure Web应用服务器上的Cron任务的虚拟环境加载变量

w6mmgewl  于 2023-11-20  发布在  Go
关注(0)|答案(1)|浏览(89)

我有一个在Azure App Service上运行的Python(Django)Web应用程序。
尽管我尝试了其他SO线程的所有方法,但我无法弄清楚如何从我的cron任务访问环境变量。这可能是由于Azure将venv复制到一个奇怪的antenv中造成的。稍后会详细介绍。
真正想要的是在cron中使用Django命令,比如./manage.py some_command。然而,我很快意识到Django虚拟环境在cron中没有正确加载。所以我决定一步一步地去看看如何从cron访问虚拟环境。

我所尝试的

初始实现

我正在使用https://{my-app-name}.scm.azurewebsites.net/webssh/host上提供的Azure App Service SSH控制台测试我的设置。

脚本

我创建了一个脚本/home/scripts/log-env.sh来测试水:

#!/bin/bash
trace=/home/scripts/trace
path=$(...) # Some command that locates the venv directory
echo "src path: ${path}" > ${trace}  # I can see ${path} is set correctly
echo "MY_VAR before source: [${MY_VAR}]" >> ${trace}
source ${path}/antenv/bin/activate; echo "MY_VAR same command line as source: [${MY_VAR}]" >> ${trace}
echo "MY_VAR after source: [${MY_VAR}]" >> ${trace}

字符串

输出

当我在终端中运行该脚本时,它显示我甚至不需要获取venv的源代码,因为在调用source之前可以访问$MY_VAR

# Content of trace file /home/scripts/trace when script runs in the terminal
src path: /tmp/8dbe5c185e85419
$MY_VAR before source: [expected_value]
$MY_VAR same command line as source: [expected_value]
$MY_VAR after source: [expected_value]


但是当它从cron运行时,$MY_VAR不会被访问,无论是在venv被激活之前还是之后:

# Content of trace file /home/scripts/trace when script runs in cron
src path: /tmp/8dbe5c185e85419
$MY_VAR before source: []  # empty
$MY_VAR same command line as source: []  # empty
$MY_VAR after source: []  # empty

cron

我在crontab中添加了以下条目:

> crontab -l
* * * * * bash /home/scripts/log-env.sh > /home/scripts/cron.log 2>&1

其他尝试

我尝试了以下更改that solved other questions on SO,但在我的情况下不起作用:

在crontab顶部添加SHELL=/bin/bash

> crontab -l
SHELL=/bin/bash
* * * * * bash /home/scripts/log-env.sh > /home/scripts/cron.log 2>&1

cron中的源码

> crontab -l
* * * * * cd /tmp/8dbe5c185e85419 && source /tmp/8dbe5c185e85419/antenv/bin/activate && /home/scripts/log-env.sh > /home/scripts/cron.log 2>&1

Azure antenv/ vs普通venv/

由于某些原因,Azure服务器有一个antenv/目录:

(antenv) root@23e4a05be277:/tmp/8dbe5c185e85419# ls -l *env
antenv:
total 16
drwxr-xr-x 2 root root 4096 Nov 15 16:30 bin
drwxr-xr-x 3 root root 4096 Nov 15 16:30 include
drwxr-xr-x 3 root root 4096 Nov 15 16:30 lib
-rw-r--r-- 1 root root  287 Nov 15 16:30 pyvenv.cfg

venv:
total 20
drwxr-xr-x 2 root root 4096 Nov 15 16:30 bin
drwxr-xr-x 3 root root 4096 Nov 15 16:30 include
drwxr-xr-x 3 root root 4096 Nov 15 16:30 lib
drwxr-xr-x 3 root root 4096 Nov 15 16:30 lib64
-rwxr-xr-x 1 root root  282 Nov 15 16:30 pyvenv.cfg


这是默认设置的环境。当连接到SSH时,它处于活动状态,如提示符中显示的(antenv)前缀:

(antenv) root@23e4a05be277:/tmp/8dbe5c185e85419


pyvenv.cfg文件如下所示:

root@23e4a05be277:/tmp/8dbe5c185e85419# cat *env/*.cfg
# antenv/pyvenv.cfg
home = /tmp/oryx/platforms/python/3.11.6/bin
include-system-site-packages = true
version = 3.11.6
executable = /tmp/oryx/platforms/python/3.11.6/bin/python3.11
command = /tmp/oryx/platforms/python/3.11.6/bin/python3.11 -m venv --copies --system-site-packages /tmp/8dbe5c185e85419/antenv

# venv/pyvenv.cfg
home = /opt/hostedtoolcache/Python/3.11.6/x64/bin
include-system-site-packages = false
version = 3.11.6
executable = /opt/hostedtoolcache/Python/3.11.6/x64/bin/python3.11
command = /opt/hostedtoolcache/Python/3.11.6/x64/bin/python -m venv /home/runner/work/jobalerts/jobalerts/venv


我尝试了antenvvenv的各种更改,但都不起作用。
不用说,我已经超出了我的能力范围。任何帮助都是受欢迎的。

bvjxkvbb

bvjxkvbb1#

正如我在评论中所写的,目前,我发现的最不可怕的解决方案是这个:https://learn.microsoft.com/en-us/answers/questions/719903/how-to-set-my-django-apps-management-commands-as-c
我并不是一个使用sleep的超级粉丝,因为调度是我的产品的关键部分,我会看看Azure的替代品,看看我是否可以在那里使用cron。

相关问题