django-chronograph脚本因权限问题无法从cron作业或手动运行

1 投票
4 回答
1031 浏览
提问于 2025-04-17 02:22

我创建了一个自定义管理命令,放在了常规的位置,文件格式是.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 个回答

0

你遇到的是操作系统权限被拒绝的问题,还是收到403错误?如果是403错误,那很可能是因为Django的CSRF保护机制导致的。如果你的脚本在向某个特定的视图发送数据,记得把这个视图标记为 csrf_exempt,这样可以关闭CSRF保护。

如果权限被拒绝是发生在文件系统或操作系统层面,那我就不太清楚了。

0

因为你正在使用虚拟环境:

里面有一个叫做 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 能顺利找到你的项目目录。

1

这个问题的答案是,chronograph.sh已经被新的chronograph取代了。虽然这个新版本应该能激活一个环境,但它激活得太晚,导致无法导入argparse。根据我的了解,argparse在Python 2.5里是没有的,但在2.6里有。所以,关键在于给chronograph脚本传递正确的参数,具体来说是-p和-e这两个参数,而不是-s。

另外,我还需要以root身份运行这个脚本,但要确保指向用户的虚拟环境里的脚本。

最后,我还得为chronograph脚本添加包目录的路径,因为在那之前它找不到argparse。

撰写回答