Djangoカスタムコマンドとcron
-
05-07-2019 - |
質問
カスタムメイドのDjangoコマンドを毎分実行するようにします。ただし、 python manage.py mycommand
が完全に機能している間は、 python /path/to/project/myapp/manage.py mycommand
は機能していないようです。
どうすればこれを達成できますか? / etc / crontab
を以下で使用します:
****** root python /path/to/project/myapp/manage.py mycommand
解決
問題は、cronがスクリプトを" bare"で実行することだと思う環境のため、DJANGO_SETTINGS_MODULEはおそらく未定義です。 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コマンド。
他のヒント
cd /path/to/project/myapp && python manage.py mycommand
このようにコマンドを連鎖させると、cdがディレクトリを正しく変更しない限り、pythonは実行されません。
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コンテキスト環境で実行されます。
これは私のプロジェクトの1つで最近やったことです(私は作業するすべてのプロジェクトのvenvsを維持しているので、venvsがあると仮定しています)
***** /path/to/venvs/bin/python /path/to/app/manage.py command_name
これは私にとって完璧に機能しました。
runscript拡張は十分に文書化されていませんでした。 djangoコマンドとは異なり、これはプロジェクト内のどこにでも移動でき、スクリプトフォルダーが必要です。 .pyファイルにはrun()関数が必要です。
-
スタンドアロンスクリプトの場合、これを行う必要があります。
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
-
djangoコマンドの場合、簡単です: 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
そして、コマンドラインで:
$ 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