【问题标题】:How to get Django virtual environment command to run as a cron job?如何让 Django 虚拟环境命令作为 cron 作业运行?
【发布时间】:2015-06-23 13:26:31
【问题描述】:

我正在使用Django Post Office 在我的 Django 1.6.2 应用程序中发送电子邮件,但我无法从 crontab 文件中执行 DPO 的“send_queued_mail”命令。我希望命令每分钟执行一次。这是我的第一个 cron 作业(由 root 用户拥有):

$ sudo crontab -e
* * * * * . /home/myproj/venv/swing/bin/activate && /home/myproj/venv/myproj/bin/python /www/myproj/manage.py send_queued_mail >> /var/log/send_mail.log 2>&1

当我检查 /var/log/syslog 时,我可以看到该命令并且它似乎正在正常执行。但是,我在 send_mail.log 文件中看到了这个错误:

Unknown command: 'send_queued_mail'
Type 'manage.py help' for usage.

我突然想到问题是因为这是 root 的 cronjob,我正在尝试为不存在的 root 激活一个虚拟环境。所以我将上面的命令移动到“myproj”用户的 crontab(这个用户拥有该项目),但我仍然得到同样的错误。

我还创建了以下“send-queued-mail-cronjob”脚本来在虚拟环境中执行命令。这种方法已在 SO 上向其他遇到相同问题的人提出建议。

#!/bin/sh
cd /home/myproj
source venv/myproj/bin/activate
venv/myproj/bin/python /www/myproj/manage.py send_queued_mail >> /var/log/send_mail.log 2>&1

我通过用户“myproj”拥有的这个 cronjob 调用它:

* * * * * /www/myproj/bin/send-queued-mail-cronjob

但是,当它运行时,我仍然收到与以前相同的“未知命令错误”。

我还有什么需要做的吗?我可以从命令行执行第一个 cronjob 中的命令而不会出错。当我以用户“myproj”登录时,我也可以从命令行运行脚本中的命令,它们运行得很好。

【问题讨论】:

  • venv 是否与sh 一起使用?见:stackoverflow.com/questions/7369145/…
  • 不相关,但我认为您的第一个 cron 作业命令中有错字:2>&! 而不是 2>&1
  • @help_asap 谢谢,打错了。
  • @jmunsch 我阅读了您提到的帖子,但我的服务器上没有 virtualenv_activate.sh 命令。 virtualenv 命令已安装到 /usr/local/bin 中,但那里没有这样的文件。
  • 您是否在/usr/local/bin 内的服务器中搜索过virtualenv_activate.sh?您是否尝试在 whole 服务器中查找它(例如,使用 findwhich 等命令)?只是为了确定你真的没有它。

标签: django cron virtualenv


【解决方案1】:

source 命令不适用于 vanilla sh 或 Ubuntu 的 dash

你需要使用:

. venv/myproj/bin/activate

代替:

source venv/myproj/bin/activate

More info.

【讨论】:

  • 我试过使用 Bash shell 和它的 "."命令,但我仍然收到“未知命令”错误。
猜你喜欢
  • 1970-01-01
  • 2015-03-07
  • 2021-07-05
  • 1970-01-01
  • 2017-08-23
  • 2017-04-13
  • 2013-07-24
  • 1970-01-01
  • 2019-01-19
相关资源
最近更新 更多