首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cron和virtualenv

Cron和virtualenv
EN

Stack Overflow用户
提问于 2010-07-20 12:33:15
回答 16查看 131.2K关注 0票数 275

我正在尝试从cron运行一个Django管理命令。我正在使用virtualenv来保持我的项目沙箱。

我在这里和其他地方看到过从virtualenv中运行管理命令的示例,如:

代码语言:javascript
复制
0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg

但是,即使syslog显示了任务应该何时启动的条目,此任务也从未实际运行过(脚本的日志文件为空)。如果我从shell中手动运行这行代码,它将按预期工作。

目前,我可以通过cron运行命令的唯一方法是将命令拆分,并将它们放入一个愚蠢的bash包装器脚本中:

代码语言:javascript
复制
#!/bin/sh
source /home/user/project/env/bin/activate
cd /home/user/project/
./manage.py command arg

编辑:

ars提出了一个有效的命令组合:

代码语言:javascript
复制
0 3 * * * cd /home/user/project && /home/user/project/env/bin/python /home/user/project/manage.py command arg

至少在我的例子中,调用virtualenv的激活脚本没有做任何事情。这是可行的,所以在节目中也是如此。

EN

Stack Overflow用户

发布于 2021-09-02 23:04:29

这是一种使crontab命令与常规命令非常相似的简单方法(在Ubuntu 18.04中进行了测试)。需要牢记的一些要点:

  • 您可以使用.命令代替source。(crontab默认使用sh,而不是bash,所以它没有在crontab命令中展开source.)
  • ~$variables。(只有crontab环境语句不进行变量扩展。)

如果您有一个~/myproject/main.py文件,下面是一些示例

代码语言:javascript
复制
* * * * * cd ~/myproject && . .venv/bin/activate && python main.py > /tmp/out1 2>&1

您也可以直接调用venv目录中python的具体路径,这样就不需要调用activate了。

代码语言:javascript
复制
* * * * * ~/myproject/.venv/bin/python ~/myproject/main.py > /tmp/out2 2>&1

这样做的缺点是您需要指定项目路径两次,这使得维护变得更加棘手。为了避免这种情况,您可以使用shell变量,以便只指定一次项目路径:

代码语言:javascript
复制
* * * * * project_dir=~/myproject ; $project_dir/.venv/bin/python $project_dir/main.py > /tmp/out3 2>&1
票数 3
EN
查看全部 16 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3287038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档