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


当前回答

由于cron在它自己的最小sh环境中执行,下面是我在虚拟环境中运行Python脚本的方法:

* * * * * . ~/.bash_profile; . ~/path/to/venv/bin/activate; python ~/path/to/script.py

(注:如果。~ /。Bash_profile不适合您,那么请尝试一下。~ /。Bashrc或。~ /。配置文件取决于您的服务器如何设置。)

这将加载您的bash shell环境,然后激活您的Python虚拟环境,基本上为您留下与测试脚本相同的设置。

不需要在crontab中定义环境变量,也不需要修改现有脚本。

其他回答

不用再看了:

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

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

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运行它,没有任何麻烦。

这也适用于crontab -e

* */5 * * * cd /home/project && sudo /home/project/venv/bin/python scripte.py

我也遇到过同样的问题,并花了很多时间去解决它。 这里没有一个解决方案对我有帮助,所以我分享了对我有用的方法:

在项目目录中打开一个新文件“pick_name.sh”。 在"pick_name.sh"文件中,写入并保存以下代码行:

#!/bin/bash
source /YOUR_VIRTUAL_ENV_PATH/bin/activate
export PYTHONPATH="${PYTHONPATH}:/PATH_TO_CUSTOM_MODULE_YOU_CREATED**OPTIONAL**"
export PYTHONPATH="${PYTHONPATH}:/PATH_TO_ANOTHER_CUSTOM_MODULE_YOU_CREATED**OPTIONAL**"
cd /PATH_TO_DIR_STORING_FILE_NAME.PY
python file_name.py

转到/var/spool/cron/crontabs(或到您的cron管理文件所在的位置)并打开“根”文件。 将这些行添加到crontab文件夹中的根文件中:

# m h  dom mon dow   command
* * * * * /PATH_TO_DIR_WHERE_PICK_NAME.SH_SITS/pick_name.sh >> /YOUR_PROJECT_DIR/cron_output.txt 2>&1

注:

This command (section 4.) will run the "pick_name.sh" file. In this example it runs every minute, so make sure you change it according to your needs. It writes all logs to a log file called "cron_ouput". No need to create the file before, it will be created automatically. Make sure to replace all paths (I wrote them in capital letters) to your paths. You can change file names, if so, make sure to change it in all appearances in my instructions to avoid errors. If you want to add another py file to run by cron, you need to add it to the "pick_nam.sh" file* not to the cron. Simply duplicate section 2. lines in the "pick_nam.sh" but without the "#!/bin/bash" part. Then, every time the cron will run "pick_name.sh" it will run all the files you specified inside of it. Make sure to restart cron after changes, it could have saved me a lot of debugging time, use this command:

systemctl restart cron

在使用virtualenv时,运行python cron作业的唯一正确方法是激活环境,然后执行环境的python来运行代码。

一种方法是在你的python脚本中使用virtualenv的activate_this,参见:http://virtualenv.readthedocs.org/en/latest/userguide.html#using-virtualenv-without-bin-python

另一种解决方案是回显完整的命令,包括激活环境并将其管道到/bin/bash.考虑一下你的/etc/crontab:

***** root echo 'source /env/bin/activate; python /your/script' | /bin/bash