如何在 crontab 中运行 Django cron?

如何在 crontab 中运行 Django cron?

我有一个使用 django-cron 的 Django 应用程序(https://django-cron.readthedocs.io/en/latest/installation.html),我需要python manage.py runcrons在 Ubuntu 上运行的 AWS EC2 中每 5 分钟执行一次。我尝试将此命令放入 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

答案1

我不熟悉 Django,但我看到了以下内容:

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

  2. 该命令source是概要到.之内bash,但不是在之内sh

  3. 因此sh -c 'source ...'将返回错误,但这&&意味着如果前一个命令返回 true,则执行下一个命令,显然您的命令在第一部分失败。您仅将最后一个命令的输出重定向到日志文件,因此它可能保持空白。

  4. 此外,我不认为您可以成功地.bashrc在内部找到资源sh

  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 中使用变量时需要使用双引号)。

相关内容