从crontab调用带激活的python脚本
我该怎么从crontab里调用一个需要激活环境的Python脚本呢?比如说,得先用命令(source env/bin/activate)来激活环境。
2 个回答
我的方法总是尽量让 crontab 保持简单,把所有的配置放在 crontab 调用的脚本里。
1) 创建一个 shell 脚本:比如说 /var/webapp/cron.sh
#!/bin/sh
PATH="/var/webapp/.env/bin:$PATH"
export PATH
cd /var/webapp/
python test.py
这里的 /var/webapp/.env/bin 是虚拟环境的位置。设置好 PATH 后,你就不需要运行 source ../activate 了。
2) 正确设置你的环境。比如说,对于一个 Django 应用:
#!/usr/bin/env python
import os
from datetime import datetime
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings.production'
os.environ['DJANGO_CONF'] = 'settings.production'
from util.models import Schedule
dset = Schedule.objects.all()
for rec in dset:
print rec
print 'cron executed %s' % datetime.today()
在这个例子中,Django 的设置文件位于 settings/production.py。
3) 最后,编辑 /etc/crontab。比如说,如果你想让它每天每半小时执行一次:
1,31 * * * * root /var/webapp/cron.sh >> /var/webapp/cron.log
注意,生成日志是很重要的,这样可以帮助你找到错误或调试信息。
Virtualenv的激活脚本其实很简单。它主要是设置你虚拟环境的Python解释器的路径;其他一些操作,比如设置PS1
、保存旧变量等等,如果你不是在交互式的命令行中,这些其实都不是必须的。所以最简单的方法就是直接用正确的Python解释器来运行你的Python脚本,这可以通过两种方式来实现:
1. 设置你的Python脚本使用虚拟环境的Python解释器
假设你的虚拟环境的解释器在~/virtualenv/bin/python
,你可以在你的Python脚本的最上面加上这个路径:
#!/home/user/virtualenv/bin/python
然后像往常一样从你的crontab中启动你的脚本。
2. 在你的cronjob中用正确的Python解释器启动脚本
假设你的脚本在~/bin/cronjob
,而你的虚拟环境的Python解释器在~/virtualenv/python
,你可以在你的crontab中写上这个:
* * * * * /home/user/virtualenv/python /home/user/bin/cronjob