Django自定义命令和cron

时间:2009-10-21 14:22:32

标签: django django-admin cron crontab

我希望我的自定义Django命令每分钟执行一次。但是,在python /path/to/project/myapp/manage.py mycommand目录中,python manage.py mycommand似乎无法正常工作。

我怎样才能做到这一点?我使用/etc/crontab

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

7 个答案:

答案 0 :(得分:19)

我认为问题是cron将在“裸”环境中运行您的脚本,因此您的DJANGO_SETTINGS_MODULE可能未定义。您可能希望将其包装在首先定义DJANGO_SETTINGS_MODULE

的shell脚本中

这样的事情:

#!/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 :(得分:12)

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

通过链接这样的命令,除非cd正确更改目录,否则不会执行python。

答案 2 :(得分:9)

如果您希望Django的生活更简单,请在项目中使用django-command-extensions:

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

你会找到一个名为“runscript”的命令,所以你只需将命令添加到你的crontab行:

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

这样的脚本将使用Django上下文环境执行。

答案 3 :(得分:2)

这是我最近在我的一个项目中所做的事情(我维护我工作的每个项目的venvs,所以我假设你有venvs)

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

这对我很有用。

答案 4 :(得分:1)

如何在 AWS EC-2 实例上安排 Django 自定义命令?

步骤-1

First, you need to write a .cron file

第 2 步

Write your script in .cron file.
<块引用>

MyScript.cron

* * * * * /home/ubuntu/kuzo1/venv/bin/python3 /home/ubuntu/Myproject/manage.py transfer_funds >> /home/ubuntu/Myproject/cron.log 2>&1

其中 * * * * * 表示脚本将每分钟运行一次。您可以根据需要进行更改 (https://crontab.guru/#*_*_*_*_*)。其中 /home/ubuntu/kuzo1/venv/bin/python3 是 python 虚拟环境路径。其中 /home/ubuntu/kuzo1/manage.py transfer_funds 是 Django 自定义命令路径 & /home/ubuntu/kuzo1/cron.log 2>&1 是一个日志文件,您可以在其中查看正在运行的 cron 日志

第 3 步

运行这个脚本

$ crontab MyScript.cron

第 4 步

一些有用的命令

1. $ crontab -l (Check current running cron job)
2. $ crontab -r (Remove cron job)

答案 5 :(得分:0)

没有详细记录脚本扩展名。与django命令不同,这个命令可以在项目中的任何位置运行,并且需要脚本文件夹。 .py文件需要run()函数。

答案 6 :(得分: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

    在(management / commands / 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
    
  3. 然后,在命令行中:

    $ python manage.py exporter
    

    现在,使用crontab将新的cron任务添加到Linux系统很容易:

    $ 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