我正在尝试从cron运行Django管理命令。我使用virtualenv保持我的项目沙盒。

我在这里和其他地方看到了从virtualenv中运行管理命令的示例,例如:

0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg

然而,尽管syslog显示了任务应该在何时启动的条目,但该任务从未实际运行(脚本的日志文件为空)。如果我从shell中手动运行这一行,它将按预期工作。

我目前可以通过cron运行命令的唯一方法是将命令分解并将它们放在一个哑bash包装脚本中:

#!/bin/sh
source /home/user/project/env/bin/activate
cd /home/user/project/
./manage.py command arg

编辑:

Ars提出了一个命令的工作组合:

0 3 * * * cd /home/user/project && /home/user/project/env/bin/python /home/user/project/manage.py command arg

至少在我的例子中,调用virtualenv的激活脚本没有任何作用。这招管用,所以节目继续。


当前回答

如果你和我一样是MacOS用户,你可以在/var/mail/{username}文件中查看crontab错误信息。像这样

tail /var/mail/{username}

如果出现“操作不允许”错误,也许你必须将cron添加到全磁盘访问应用程序(安全和隐私>隐私>全磁盘访问应用程序/execs)。

点击+按钮,转到/usr/sbin,双击cron文件。 然后它将修复“不允许”错误。详细步骤

这是我的代码:

0 19 * * * cd /Users/user/Desktop/Project && source /Users/user/Desktop/Project/venv/bin/activate && python command arg

其他回答

你应该能够通过在虚拟环境中使用python来做到这一点:

/home/my/virtual/bin/python /home/my/project/manage.py command arg

编辑:如果你的django项目不在PYTHONPATH目录下,那么你需要切换到正确的目录:

cd /home/my/project && /home/my/virtual/bin/python ...

您也可以尝试从cron记录失败:

cd /home/my/project && /home/my/virtual/bin/python /home/my/project/manage.py > /tmp/cronlog.txt 2>&1

另一件要尝试的事情是在你的manage.py脚本最上面做同样的改变:

#!/home/my/virtual/bin/python

这是一个对我很有效的解决办法。

source /root/miniconda3/etc/profile.d/conda.sh && \
conda activate <your_env> && \
python <your_application> &

我在Ubuntu 18.04.3 LTS上使用Conda 4.7.12版本的miniconda。

我可以把上面的代码放在一个脚本中,并通过crontab运行它,没有任何麻烦。

与其在虚拟环境特定的shebangs上瞎折腾,还不如在crontab上预先加上PATH。

在激活的virtualenv中,运行这三个命令,python脚本就可以工作了:

$ echo "PATH=$PATH" > myserver.cron
$ crontab -l >> myserver.cron
$ crontab myserver.cron

crontab的第一行现在应该是这样的:

PATH=/home/me/virtualenv/bin:/usr/bin:/bin:  # [etc...]

在venv中添加Python安装路径,但不要激活环境。

* * * * * /HDD1/shritam_kumar/VENOM/venv/bin/python /HDD1/shritam_kumar/Projects/Voelkner-DE/schedule_product_BA.py

就是这么简单。

我也有同样的问题:

我写了一个自定义的django命令来检查geodjango多边形内部的geodjango位置坐标,并且在自动化任务运行时遇到了麻烦,然而使用crontab这个命令对我来说是有效的:

* * * * * ./home/project/locations/locations.sh >> /var/log/locations.log 2>&1