如何在crontab中运行Django cron?

我有一个使用django-cron(https://django-cron.readthedocs.io/en/latest/installation.html)的Django应用程序,我需要在运行在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在使用可执行文件时,始终提供完整的路径名(在本例中为python)。 - Jos
我已经更新到了/home/user/django-apps/venv/bin/python,但它仍然无法运行。 - Vince Gonzales
1个回答

我对Django不熟悉,但是我看到了下面的内容:

  1. 默认的Cron的shell是/bin/sh

  2. source命令在bash中等同于.,但在sh中不是。

  3. 因此,sh -c 'source ...'会返回错误,但&&表示如果前一个命令返回true,则执行下一个命令,显然你的命令在这个第一部分上失败了。你只重定向了最后一个命令的输出到日志文件,所以可能它仍然是空白的。

  4. 此外,我不认为你能在sh中成功地执行.bashrc

  5. crontab中,环境变量$PATH的默认值是/usr/bin:/bin。对于位于这些目录之外的所有命令/脚本,您应该使用完整路径;您可以在作业之前export一个新的$PATH值;或者甚至可以使用$(which my_command)而不是简单的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 还会将错误重定向到日志文件中。
另一种方式,我更喜欢的是创建一个简单的脚本来执行所有这些命令:
#!/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(请记住,在shell中使用变量时需要使用双引号)。

谢谢!现在它可以工作了,虽然我只是需要将'source'替换为'./'才能使它在脚本内正常运行。 :) - Vince Gonzales
解除活动状态呢?脚本每隔5分钟运行一次,每次进入环境... - cwhisperer