通过cron运行django的python脚本

问题描述:

我有一个python脚本,连接到外部主机,获取一些数据,并用数据填充Django数据库。用于填充数据库的Python脚本使用这些线路设置Django的环境:通过cron运行django的python脚本

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不会运行!我在日志文件中没有错误。我敢肯定这是非常简单的事情,但我只是没有看到它...

+0

是否在'/ var/log/cron'中显示了任何内容? – 2010-08-10 00:33:04

+0

有没有理由不使用管理命令? – 2010-08-10 07:31:08

+0

我在cron日志中获得了cronjob在指定时间运行的条目,所以在那里没有问题。 – 2010-08-10 07:59:41

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

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

想到两件事。我不认为cron会使您期望的代字符替换 - 也许我错了,但请尝试在您的cron条目中指定完整路径(即/ home/myuser/project_dir/...)以及脚本。

另外,您的cron条目中的“django”是什么?这是你的脚本的名字或是一个错字?最后,记录从你的脚本的执行可能出现的错误,请尝试:

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

django是用户 – 2010-08-10 07:59:00

+0

其实,现在我已经改变了设置,所以我做'crontab -e'作为django用户,并且包含你演示的行。这可能是这样做的正确方法。 – 2010-08-10 08:14:28