私は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
私はDjangoに精通していませんが、次のように見えます:
デフォルトのCronのシェルは_/bin/sh
_です。
コマンドsource
は、bash
内では_.
_の概要ですが、sh
内ではありません。
したがって、_sh -c 'source ...'
_はエラーを返しますが、_&&
_は、前のコマンドがtrueを返した場合に次のコマンドを実行することを意味し、この最初の部分でコマンドが失敗したようです。最後のコマンドの出力のみをログファイルにリダイレクトしているため、おそらく空白のままです。
さらに、sh
内で_.bashrc
_を正常に調達できるとは思いません。
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を使用する必要があることに注意してください)シェルで変数を使用する場合は引用符で囲みます)。