2010-08-09 219 views
2

我有一個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

回答

2

的問題是實際上我有一個環境變量來告訴Django如果在開發或生產運行。 Crontab不會執行.bashrc文件,我在這裏導出這個變量,因此必須將其添加到我的shell腳本中:

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

想到兩件事。我不認爲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