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


当前回答

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

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

就是这么简单。

其他回答

在使用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

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

在项目目录中打开一个新文件“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

不用再看了:

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

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

如果你和我一样是MacOS用户,你可以在/var/mail/{username}文件中查看crontab错误信息。像这样

tail /var/mail/{username}

如果出现“操作不允许”错误,也许你必须将cron添加到全磁盘访问应用程序(安全和隐私>隐私>全磁盘访问应用程序/execs)。

点击+按钮,转到/usr/sbin,双击cron文件。 然后它将修复“不允许”错误。详细步骤

这是我的代码:

0 19 * * * cd /Users/user/Desktop/Project && source /Users/user/Desktop/Project/venv/bin/activate && python command arg