17

我希望每分钟执行一次我定制的 Django 命令。但是,在目录中完美运行python /path/to/project/myapp/manage.py mycommand时似乎似乎不起作用。python manage.py mycommand

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

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

7 回答 7

22

我认为问题在于 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 命令。

于 2009-10-21T14:32:01.490 回答
13
cd /path/to/project/myapp && python manage.py mycommand

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

于 2010-04-11T00:30:51.723 回答
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 上下文环境中执行。

于 2009-10-21T14:50:38.637 回答
2

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

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

这对我来说非常有效。

于 2013-06-18T10:54:16.980 回答
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 日志

第三步

运行此脚本

$ crontab MyScript.cron

第4步

一些有用的命令

1. $ crontab -l (Check current running cron job)
2. $ crontab -r (Remove cron job)
于 2021-07-07T10:27:09.710 回答
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

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

$ 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
于 2014-08-15T19:01:07.283 回答
0

runscript 扩展没有很好的记录。与 django 命令不同,这个命令可以在您的项目中的任何地方运行,并且需要一个脚本文件夹。.py 文件需要一个 run() 函数。

于 2010-04-11T00:23:05.627 回答