django-chronograph脚本因权限问题无法从cron作业或手动运行
我创建了一个自定义管理命令,放在了常规的位置,文件格式是.py。
chronograph安装在正确的位置,并且同步也正常。
我创建了一个定时任务,内容如下:
* * * * * /home/shofty/virtualenvs/webbricks/bin/chronograph -e /home/shofty/virtualenvs/webbricks/bin/activate_this.py -p /home/shofty/virtualenvs/webbricks/website
我还尝试了以下内容,因为我觉得这可能是正确的,但文档里没有提到。
* * * * * /home/shofty/virtualenvs/webbricks/bin/chronograph -e /home/shofty/virtualenvs/webbricks/bin/activate_this.py -p /home/shofty/virtualenvs/webbricks/website/manage.py cron
我添加了manage.py cron,因为这是用来告诉chronograph去查找需要运行的任务的。如果我在我的虚拟环境中运行manage.py cron,它可以正常工作,任务也能运行。
但是这两个任务都无法运行,当我尝试手动运行它们时,无论是以超级用户身份还是我的用户身份,都会因为权限被拒绝而失败。我不太确定这里提到的权限指的是什么。有没有人遇到过类似的情况?
4 个回答
你遇到的是操作系统权限被拒绝的问题,还是收到403错误?如果是403错误,那很可能是因为Django的CSRF保护机制导致的。如果你的脚本在向某个特定的视图发送数据,记得把这个视图标记为 csrf_exempt,这样可以关闭CSRF保护。
如果权限被拒绝是发生在文件系统或操作系统层面,那我就不太清楚了。
因为你正在使用虚拟环境:
里面有一个叫做 chronograph.sh
的脚本。把这个文件复制到你的项目目录里。
cp chronograph.sh ~/virtualenvs/webbricks/chronograph.sh
你需要打开这个脚本,并修改里面的路径,指向你虚拟环境中的 activate
脚本:
$PROJECT_PATH"/home/shofty/virtualenvs/webbricks/bin/activate"
确保这个文件是可执行的,然后更新你的 crontab
来执行这个脚本。
chmod a-x chronograph.sh
然后,输入:
crontab -e
* * * * * /home/shofty/virtualenvs/webbricks/chronograph.sh /home/shofty/virtualenvs/webbricks/website
确保你把 /path/to/your/project
作为第一个参数传给脚本。这样可以确保 cron
能顺利找到你的项目目录。
这个问题的答案是,chronograph.sh已经被新的chronograph取代了。虽然这个新版本应该能激活一个环境,但它激活得太晚,导致无法导入argparse。根据我的了解,argparse在Python 2.5里是没有的,但在2.6里有。所以,关键在于给chronograph脚本传递正确的参数,具体来说是-p和-e这两个参数,而不是-s。
另外,我还需要以root身份运行这个脚本,但要确保指向用户的虚拟环境里的脚本。
最后,我还得为chronograph脚本添加包目录的路径,因为在那之前它找不到argparse。