web-dev-qa-db-ja.com

crontabでDjango cronを実行するには?

私はDjango Django-cronを使用するアプリケーション( https://Django-cron.readthedocs.io/en/latest/installation.html )を持っています)、そして私はUbuntuで実行されているAWS EC2で5分ごとにpython manage.py runcronsを実行する必要があります。このコマンドをcrontab -eに入れてみましたが、何も起こりません。何か見落としはありますか?

*/5 * * * * source /home/user/.bashrc && source /home/user/Django-apps/venv/bin/activate && python /home/user/Django-apps/project/manage.py runcrons > /home/bongga-admin/cronjob.log
3
Vince Gonzales

私はDjangoに精通していませんが、次のように見えます:

  1. デフォルトのCronのシェルは_/bin/sh_です。

  2. コマンドsourceは、bash内では_._の概要ですが、sh内ではありません。

  3. したがって、_sh -c 'source ...'_はエラーを返しますが、_&&_は、前のコマンドがtrueを返した場合に次のコマンドを実行することを意味し、この最初の部分でコマンドが失敗したようです。最後のコマンドの出力のみをログファイルにリダイレクトしているため、おそらく空白のままです。

  4. さらに、sh内で_.bashrc_を正常に調達できるとは思いません。

  5. crontab内では、envvar _$PATH_のデフォルト値は_/usr/bin:/bin_です。これらのディレクトリの外にあるすべてのコマンド/スクリプトについては、完全パスを適用する必要があります。ジョブの前に、export _$PATH_の新しい値を指定できます。または、_my_command_の代わりに$(which my_command)を使用することもできます。


上記によると、あなたのcrontabエントリは次のようなものである必要があると思います。

_*/5 * * * * bash -c 'source /home/user/.bashrc && source /home/user/Django-apps/venv/bin/activate && python /home/user/Django-apps/project/manage.py runcrons' > /home/user/cronjob.log 2>&1
_
  • 最後の部分_2>&1_は、エラーもログファイルにリダイレクトします。

もう1つの方法は、これらのすべてのコマンドを実行する単純なスクリプトを作成することです。

_#!/bin/bash
source /home/user/.bashrc
source /home/user/Django-apps/venv/bin/activate
python /home/user/Django-apps/project/manage.py runcrons
_

スクリプトは実行可能である必要があります。

_chmod +x /path/to/script.sh
_

そしてcrontabはより単純になります:

_*/5 * * * * /path/to/script.sh > /home/user/cronjob.log 2>&1
_

Cronジョブが特定のユーザーのcrontabによってトリガーされ、スクリプトをよりポータブルにする場合は、_/home/user_を環境変数_$HOME_に置き換えることができます(doubleを使用する必要があることに注意してください)シェルで変数を使用する場合は引用符で囲みます)。

1
pa4080