我正在尝试从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的激活脚本没有任何作用。这招管用,所以节目继续。


当前回答

python脚本

from datetime import datetime                                                                                                                                                                
import boto   # check wheather its taking the virtualenv or not                                                                                                                                                                        
import sys                                                                                                                                                                                   
param1=sys.argv[1]     #Param                                                                                                                                                                                                                                                                                                                                                                    
myFile = open('appendtxt.txt', 'a')                                                                                                                                                      
myFile.write('\nAccessed on ' + param1+str(datetime.now())) 

Cron命令

 */1 * * * *  cd /Workspace/testcron/ && /Workspace/testcron/venvcron/bin/python3  /Workspace/testcron/testcronwithparam.py param  

在上述命令中

*/1 * * * * -每一分钟执行一次 cd /Workspace/testcron/—python脚本所在路径 /Workspace/testcron/venvcron/bin/python3 - Virtualenv路径 Workspace/testcron/testcronwithparam.py -文件路径 参数-参数

其他回答

与其在虚拟环境特定的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...]

从cronfile运行source将不起作用,因为cron使用/bin/sh作为它的默认shell,它不支持source。您需要设置SHELL环境变量为/bin/bash:

SHELL=/bin/bash
*/10 * * * * root source /path/to/virtualenv/bin/activate && /path/to/build/manage.py some_command > /dev/null

很难发现为什么会失败,因为/var/log/syslog没有记录错误细节。最好将自己别名为root,这样你就会收到带有任何cron错误的电子邮件。只需将自己添加到/etc/aliases并运行sendmail -bi。

更多信息: http://codeinthehole.com/archives/43-Running-django-cronjobs-within-a-virtualenv.html

上面的链接更改为: https://codeinthehole.com/tips/running-django-cronjobs-within-a-virtualenv/

python脚本

from datetime import datetime                                                                                                                                                                
import boto   # check wheather its taking the virtualenv or not                                                                                                                                                                        
import sys                                                                                                                                                                                   
param1=sys.argv[1]     #Param                                                                                                                                                                                                                                                                                                                                                                    
myFile = open('appendtxt.txt', 'a')                                                                                                                                                      
myFile.write('\nAccessed on ' + param1+str(datetime.now())) 

Cron命令

 */1 * * * *  cd /Workspace/testcron/ && /Workspace/testcron/venvcron/bin/python3  /Workspace/testcron/testcronwithparam.py param  

在上述命令中

*/1 * * * * -每一分钟执行一次 cd /Workspace/testcron/—python脚本所在路径 /Workspace/testcron/venvcron/bin/python3 - Virtualenv路径 Workspace/testcron/testcronwithparam.py -文件路径 参数-参数

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

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

就是这么简单。

不用再看了:

0 3 * * * /usr/bin/env bash -c 'cd /home/user/project && source /home/user/project/env/bin/activate && ./manage.py command arg' > /dev/null 2>&1

通用的方法:

* * * * * /usr/bin/env bash -c 'YOUR_COMMAND_HERE' > /dev/null 2>&1

这样做的好处是您不需要将crontab的SHELL变量从sh更改为bash