我正在尝试从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的激活脚本没有任何作用。这招管用,所以节目继续。
我已经在我的Django项目中添加了下面的脚本manage.sh,它获取了virtualenv,然后运行manage.py脚本,不管你传递给它什么参数。它使得在virtualenv (cron, systemd单元,基本上任何地方)中运行命令变得非常容易:
#! /bin/bash
# this is a convenience script that first sources the venv (assumed to be in
# ../venv) and then executes manage.py with whatever arguments you supply the
# script with. this is useful if you need to execute the manage.py from
# somewhere where the venv isn't sourced (e.g. system scripts)
# get the script's location
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
# source venv <- UPDATE THE PATH HERE WITH YOUR VENV's PATH
source $DIR/../venv/bin/activate
# run manage.py script
$DIR/manage.py "$@"
然后在你的cron条目中运行:
0 3 * * * /home/user/project/manage.sh command arg
只需记住,您需要使manage.sh脚本可执行
由于cron在它自己的最小sh环境中执行,下面是我在虚拟环境中运行Python脚本的方法:
* * * * * . ~/.bash_profile; . ~/path/to/venv/bin/activate; python ~/path/to/script.py
(注:如果。~ /。Bash_profile不适合您,那么请尝试一下。~ /。Bashrc或。~ /。配置文件取决于您的服务器如何设置。)
这将加载您的bash shell环境,然后激活您的Python虚拟环境,基本上为您留下与测试脚本相同的设置。
不需要在crontab中定义环境变量,也不需要修改现有脚本。
我很抱歉第n个答案,但我检查了答案,确实有更简单和整洁的答案。
长话短说
在你的cron中使用venv的python二进制文件:
0 3 * * * /home/user/project/env/bin/python /home/user/project/manage.py
很长的故事
We activate the virtual environment when we want to set the current shell with the python config of that specific virtual environment(that is binaries and modules of that).
It is relevant to work with the current shell : execute multiple python commands on the current shell without the need to reference the full python path of the venv.
In the frame of a cron or even a bash, which value to activate the environment ?
Besides I read in some answers some references to bash rather than sh or still to define a wrapper to call the Python code. But why the hell should we bother with these ?
重复一遍,照做就好:
0 3 * * * /home/user/project/env/bin/python /home/user/project/manage.py
文件证实:
你不需要特别激活一个环境;激活
只需将虚拟环境的二进制目录前置到您的路径,
这样" python "就会调用虚拟环境的python解释器
您可以运行已安装的脚本,而不必使用它们的全部
路径。但是,在虚拟环境中安装的所有脚本都应该
在不激活它的情况下也可以运行,并使用虚拟机运行
环境的Python自动。