【问题标题】:Scheduling django custom command调度django自定义命令
【发布时间】:2011-05-30 00:32:16
【问题描述】:

我很难让我的自定义命令按计划运行。我已经尝试了一个 cronjob 和 django-chronograph,但我似乎无法让它像在命令行中那样(成功地)运行。

我只是使用安装在 Ubunutu 上的 django 在本地开发一个应用程序。

我有一个自定义命令,用于清除超过 30 天的日志条目。为了反复测试,我对其进行了修改,使其只删除一个有点随意的条目:

from datetime import datetime, timedelta
from hitcount.models import Hit
from django.core.management.base import BaseCommand, CommandError

class Command(BaseCommand):
    args = '<days>'
    help = 'Clear out all Hits that occured over "days" days ago'

    def handle(self, *args, **options):
        list = Hit.objects.filter(created__lt = datetime.now()-timedelta(days=2) )
        list[0].delete()

        self.stdout.write('Hit deleted - %s' % list[0])

此命令(del_hit.py)位于以下结构中:

/project_dir
   /app
      /management
         __init__.py
         /commands
            __init__.py
            del_hit.py

正如我所说,我可以从我的 project_dir 成功运行此命令

python manage.py del_hit

我尝试安装django-chronograph。它似乎非常有用。它识别出我的命令并允许我从下拉列表中选择它。我按照指示应用了 cron:

          • /home/vadmin/development/python/my_proj/manage.py cron

但是,当它尝试执行命令时,它在日志中给了我以下错误:

The job failed to run. The exception was :

Unknown command: u'del_hit'

Traceback (most recent call last):

File "/home/vadmin/development/python/my_proj/chronograph/models.py", line 213, in handle_run
call_command(self.command, *args, **options)

File "/usr/lib/python2.6/dist-packages/django/core/management/__init__.py", line 155, in call_command
raise CommandError("Unknown command: %r" % name)

CommandError: Unknown command: u'del_hit'

我尝试自己从标准视图运行命令:

from django.core.management import call_command
def test_del(request):
    list = Hit.objects.filter(created__lt = datetime.now()-timedelta(days=2) )

    args = []
    options = {}
    call_command('del_hit', *args, **options)

return render_to_response('test.html', {'del_hit_item':list[0]})

这确实成功执行了。

最后,我尝试设置一个 cronjob 每小时执行一次

30 * * * * python /home/vadmin/development/python/my_proj/manage.py del_hit

这不起作用。

我可以使用 django-chronograph(最好)或简单的 cronjob 来让我的自定义命令按计划运行

【问题讨论】:

  • 您是从 HEAD 安装的,还是已确认的版本?您是否尝试过将其暂时换成旧版本? (请参阅code.google.com/p/django-chronograph - 由于模型略有不同,因此需要重新同步数据库)
  • 你能不能把你的命令改成不接受参数——也许问题在于 django-chronograph 如何传入 args?
  • 当您尝试通过 crontab 直接运行失败的命令时,id /var/log/syslog 或您的 cron 日志说明了什么?
  • 感谢 cmets。我尝试禁用参数。没有骰子。系统日志并没有说太多:Dec 23 09:53:01 vadmin CRON[4002]: (vadmin) CMD (python /home/vadmin/development/python/my_proj/manage.py del_hit)。我在哪里可以找到 cron 日志?
  • @Ed:cron 应该通过电子邮件向您发送 cronjobs 的任何输出。如果您使用的是根 crontab,请在调用您的脚本的 cron 行之前添加一行 MAILTO=ed@acme.com。

标签: django cron


【解决方案1】:

要编写适合 crontab 的 django 脚本,请将以下几行放在顶部:

#!/usr/bin/python

from django.core.management import setup_environ
import settings
setup_environ(settings)

如果您的文件不在 settings.py 的同一文件夹中,请将您的应用程序文件夹附加到 pythons 路径。

【讨论】:

【解决方案2】:

看起来您需要在项目目录中才能正常工作。

尝试更新您调用的命令以首先执行“cd”,

(cd /home/vadmin/development/python/my_proj &amp;&amp; ./manage.py del_hit)

【讨论】:

  • 这行得通,不过如果有人知道如何使用 django-chronograph,我也很想听听。
  • 啊 - 也许你的 PYTHONPATH 不包括项目的根目录?
  • 嗯。当我说:import os, os.environ['PYTHONPATH'].spplit(os.pathsep),我得到 ['/home/vadmin/development/python/my_proj']
猜你喜欢
  • 2017-12-02
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 2013-10-05
相关资源
最近更新 更多