Django custom command and cron

后端 未结 6 1835
刺人心
刺人心 2020-12-02 15:17

I want my custom made Django command to be executed every minute. However it seems like python /path/to/project/myapp/manage.py mycommand doesn\'t seem to work

相关标签:
6条回答
  • 2020-12-02 15:27

    If you want your Django life a lot more simple, use django-command-extensions within your project:

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

    You'll find a command named "runscript" so you simply add the command to your crontab line:

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

    And such a script will execute with the Django context environment.

    0 讨论(0)
  • 2020-12-02 15:30

    I think the problem is that cron is going to run your scripts in a "bare" environment, so your DJANGO_SETTINGS_MODULE is likely undefined. You may want to wrap this up in a shell script that first defines DJANGO_SETTINGS_MODULE

    Something like this:

    #!/bin/bash
    
    export DJANGO_SETTINGS_MODULE=myproject.settings 
    ./manage.py mycommand
    

    Make it executable (chmod +x) and then set up cron to run the script instead.

    Edit

    I also wanted to say that you can "modularize" this concept a little bit and make it such that your script accepts the manage commands as arguments.

    #!/bin/bash
    
    export DJANGO_SETTINGS_MODULE=myproject.settings
    ./manage.py ${*}
    

    Now, your cron job can simply pass "mycommand" or any other manage.py command you want to run from a cron job.

    0 讨论(0)
  • 2020-12-02 15:33
    cd /path/to/project/myapp && python manage.py mycommand
    

    By chaining your commands like this, python will not be executed unless cd correctly changes the directory.

    0 讨论(0)
  • 2020-12-02 15:35

    This is what i have done recently in one of my projects,(i maintain venvs for every project i work, so i am assumning you have venvs)

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

    This worked perfectly for me.

    0 讨论(0)
  • 2020-12-02 15:38

    The runscript extension wasn't well documented. Unlike the django command this one can go anywhere in your project and requires a scripts folder. The .py file requires a run() function.

    0 讨论(0)
  • 2020-12-02 15:49
    1. If its a standalone script, you need to do this:

      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. If its a django command, its easier: https://coderwall.com/p/k5p6ag

      In (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
      

    And then, in the command line:

    $ python manage.py exporter
    

    Now, it's easy to add a new cron task to a Linux system, using crontab:

    $ crontab -e
    
    or $ sudo crontab -e if you need root privileges
    

    In the crontab file, for example for run this command every 15 minutes, something like this:

    # m h  dom mon dow   command
    */15 * * * * python /var/www/myapp/manage.py exporter
    
    0 讨论(0)
提交回复
热议问题