1

我正在尝试在安装在虚拟环境下的 Django 应用程序上运行自定义管理命令。

该任务应该每分钟运行一次,我无法弄清楚为什么它不起作用。

这是我的 crontab 中的内容:

*/1 * * * * /home/myuser/.virtualenvs/myvirtualenv/bin/python /home/myuser/myapp/manage.py mycommand --settings=myapp.settings

即使我在 中看到命令每分钟执行一次,这也不起作用/var/log/syslog,但它一定是失败的,因为它没有产生任何效果。

如果我只是复制并运行相同的命令,一切都会顺利进行。

然后我尝试运行一个外部 bash 脚本,如果我手动运行它,它又可以完美运行:

*/1 * * * * source /home/myuser/myapp/myscript

该脚本激活 virtualenv 并运行管理命令。再次,没有结果。

我有点迷茫,因为我已经彻底搜索并且完全被卡住了,因为显然没有任何错误消息出现在任何地方。

4

4 回答 4

1

问题可能myapp.settings不在您的 Python 路径上。我会先尝试更改目录:

*/1 * * * * cd /home/mysuser/myapp && /home/myuser/.virtualenvs/myvirtualenv/bin/python manage.py mycommand --settings=myapp.settings
于 2016-03-22T20:22:24.760 回答
0

没有显示错误消息的原因是 cron 通过电子邮件将它们发送到正在执行 crontab 的用户的邮箱。

  • 如果您使用 来创建 cronjobs crontab -e,这将是您登录时使用的用户的邮箱。
  • 如果您使用 来创建 cronjobs sudo crontab -e,这将是 root 用户的邮箱。

要阅读电子邮件,您必须设置电子邮件服务器和客户端。为此,postfix(即服务器)和mutt(客户端)是非常流行的选项,它们的安装在许多优秀的教程中都有介绍。

确保区分登录用户的邮箱(通过打开)mutt和 root 用户的邮箱(需要sudo mutt.

完成此设置后,调试将变得容易得多。

于 2020-04-03T14:38:33.137 回答
0

我有一个类似的问题。我的代码无法从设置文件中获取任何变量。当我更改目录并激活虚拟环境时,它已修复。

*/1 * * * * cd /home/myuser/myapp && source /home/myuser/.virtualenvs/myvirtualenv/bin/activate && /home/myuser/.virtualenvs/myvirtualenv/bin/python /home/myuser/myapp/manage.py mycommand --settings=myapp.settings

应该适用于您的情况。

于 2020-11-28T14:20:19.970 回答
0

在我自己的一个项目中摆弄了 crontabs 之后,我开始使用Celery(更具体地说是 Celery Beat)来完成我的定期任务。设置起来稍微复杂一点(您将需要一个消息代理,例如 Redis),但之后它的功能要强大得多。

即使您不使用异步任务执行,管理 cron 作业的便利性也值得设置。可以通过使用函数装饰器在项目代码中简单地定义作业,无需在服务器上编辑 crontab。

为了管理 Celery worker(s) 和 celery beat 过程,我建议使用supervisord

于 2016-03-22T22:37:36.910 回答