2009-10-21 89 views
13

我想讓我的自定義Django命令每分鐘執行一次。但看起來好像python /path/to/project/myapp/manage.py mycommand似乎不工作,而在目錄python manage.py mycommand完美的作品。Django自定義命令和cron

我該如何做到這一點?我用/etc/crontab有:

****** root python /path/to/project/myapp/manage.py mycommand 

回答

16

我認爲問題是,cron是要在一個「裸」的環境中運行腳本,所以你的DJANGO_SETTINGS_MODULE可能是不確定的。你可能想在一個shell腳本,首先定義DJANGO_SETTINGS_MODULE

像這樣的東西來包裝這件事:

#!/bin/bash 

export DJANGO_SETTINGS_MODULE=myproject.settings 
./manage.py mycommand 

讓它運行(chmod + X),然後設置cron來運行該腳本來代替。

編輯

我還想說,你可以通過「模塊化」這個概念一點點,讓這樣你的腳本接受作爲參數的管理命令。

#!/bin/bash 

export DJANGO_SETTINGS_MODULE=myproject.settings 
./manage.py ${*} 

現在,您的cron作業可以簡單地傳遞「mycommand」或任何其他要從cron作業運行的manage.py命令。

+1

這是說,當我做到這一點未知命令。我必須將其更改爲: cd/path/to/project ./manage.py $ {*} – mhost 2010-02-21 19:27:11

+0

沒有成功。自定義命令被識別,但命令顯然無法找到數據庫 – Raphael 2011-09-15 18:57:34

+0

你是什麼意思的「命令顯然無法找到數據庫」?這是否會造成某種錯誤? – 2011-09-16 19:48:08

9

如果你希望你的項目中你的Django生活帶來很多更簡單,使用Django的命令擴展:

http://code.google.com/p/django-command-extensions/

你會發現一個命令名爲「runScript中」,所以你只需添加命令到您的crontab行:

****** root python /path/to/project/myapp/manage.py runscript mycommand 

而這樣的腳本將與Django上下文環境一起執行。

0

腳本擴展沒有很好的記錄。與django命令不同的是,這個命令可以在你項目中的任何地方使用,並且需要一個腳本文件夾.py文件需要run()函數。

11
cd /path/to/project/myapp && python manage.py mycommand 

通過像這樣鏈接你的命令,python將不會被執行,除非cd正確地更改目錄。

+0

這是對我來說最簡單的方法,它運行良好。謝謝大衛! – thomallen 2011-04-06 23:55:21

+2

,這對我不起作用(在我的郵件中仍然有一個名爲django.core.management的No模塊錯誤) – 2012-04-30 15:32:06

1

這就是我在我的項目之一最近完成的,(我保持每一個項目我工作venvs,所以我assumning你有venvs)

***** /path/to/venvs/bin/python /path/to/app/manage.py command_name 

這完美地工作了我。

0
  1. 如果其獨立的腳本,你需要這樣做:

    from django.conf import settings 
    from django.core.management import setup_environ 
    setup_environ(settings) 
    
    #your code here which uses django code, like django model 
    
  2. 如果它的Django的命令,它更容易:https://coderwall.com/p/k5p6ag

    在(管理/命令/ exporter.py )

    from django.core.management.base import BaseCommand, CommandError 
    
    class Command(BaseCommand): 
        args = '' 
        help = 'Export data to remote server' 
    
        def handle(self, *args, **options): 
         # do something here 
    

,然後在命令行:

$ python manage.py exporter 

現在,很容易到一個新的cron任務添加到Linux系統,使用crontab中:

$ crontab -e 

or $ sudo crontab -e if you need root privileges 

在crontab文件,例如用於運行此命令每隔15分鐘,這樣的事情:

# m h dom mon dow command 
*/15 * * * * python /var/www/myapp/manage.py exporter