我有一个使用 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,但我看到了以下内容:
默认的 Cron 的 shell 是
/bin/sh
。该命令
source
是概要到.
之内bash
,但不是在之内sh
。因此
sh -c 'source ...'
将返回错误,但这&&
意味着如果前一个命令返回 true,则执行下一个命令,显然您的命令在第一部分失败。您仅将最后一个命令的输出重定向到日志文件,因此它可能保持空白。此外,我不认为您可以成功地
.bashrc
在内部找到资源sh
。在 中
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 中使用变量时需要使用双引号)。