【问题标题】:Running a python script for django via cron通过 cron 为 django 运行 python 脚本
【发布时间】:2011-03-27 10:52:57
【问题描述】:

我有一个 python 脚本,它连接到外部主机,获取一些数据,并用数据填充 Django 数据库。填充数据库的 python 脚本使用这些行来设置 django 环境:

path = os.path.normpath(os.path.join(os.getcwd(), '..'))
sys.path.append(path)
from django.core.management import setup_environ
import settings
setup_environ(settings)

然后我有一个实际运行 python 脚本的 shell 脚本:

export PYTHONPATH=$PYTHONPATH:/home/django/project_dir/
cd ~/project_dir/scripts/
~/virtualenv/bin/python my_script.py

然后是我的 cron 配置,它放在 /etc/cron.d/ 中

0 1 * * * django ~/project_dir/scripts/my_script.sh > /var/log/django_cron.log

请注意,django 项目有自己的用户和虚拟环境。

当我以 django 用户身份登录时,shell 脚本运行良好。但是cron不会运行!我在日志文件中没有错误。我确定这是非常简单的事情,但我只是没有看到它......

【问题讨论】:

  • /var/log/cron 中是否显示任何内容?
  • 有理由不使用管理命令吗?
  • 我在 cron 日志中得到了 cronjob 在指定时间运行的条目,所以那里没有问题。

标签: linux django ubuntu cron


【解决方案1】:

问题实际上是我有一个环境变量来告诉 django 它是在开发还是生产中运行。 Crontab 不执行我导出此变量的 .bashrc 文件,因此必须将其添加到我的 shell 脚本中:

export FLAVOR=live
export PYTHONPATH=$PYTHONPATH:/home/django/project_dir/
cd ~/project_dir/scripts/
~/virtualenv/bin/python my_script.py

【讨论】:

    【解决方案2】:

    我想到了两件事。我认为cron 不会进行您期望的波浪号替换——也许我错了,但请尝试在您的 cron 条目以及您的脚本。

    另外,你的 cron 条目中的“django”是什么?是您的脚本名称还是错字?最后,要记录脚本执行过程中可能出现的错误,请尝试:

    0 1 * * * /home/myuser/project/script.sh > /var/log/django_cron.log 2>&1
    

    【讨论】:

    • 实际上,现在我已经更改了设置,所以我以 django 用户的身份执行“crontab -e”,并包含您演示的行。这可能是正确的方法。
    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 2021-11-21
    • 2019-12-24
    • 2015-03-16
    • 2017-08-11
    • 2016-10-01
    • 2014-06-20
    • 1970-01-01
    相关资源
    最近更新 更多