(转载自 StackOverflow)
我已经设置了 cron 来为 ubuntu 16.04 中的 django-cron(django 1.10.5、python 3.5、anaconda 4.2.0)执行以下命令:
PATH=/user/project/projectname/website
* * * * * ./manage.py runcrons "app.crons.RunCronJob"
这是我的文件树,它位于远程站点的最高级别正下方(/
):
|-- user
| |-- project
| | |-- projectname
| | | |-- website
| | | | |-- file.txt
| | | | |-- manage.py
| | | | |-- app (a django app)
| | | | | |-- crons.py
RunCronJob
是一个 cronjob,它会在下crons.py
添加一行。当我进入目录并手动执行时,它工作正常。但是,当我设置的 cronjob 运行时,它不会将任何内容附加到我的文本文件中。我已经使用邮件服务验证了 cron 任务每分钟都在运行,但我收到的数据似乎没有告诉我它为什么不起作用的任何有用信息。file.txt
/website
/website
./manage.py runcrons "app.crons.RunCronJob"
grep cron /var/log/syslog
(python 注释:我已将os.chdir(os.path.dirname(sys.argv[0]))
其添加到我的crons.py
确保文本文件写入正确的目录,无论命令从哪里运行。例如,从运行website/manage.py runcrons "app.crons.RunCronJob"
对/projectname
我来说也是有效的。因此,我不怀疑我的问题与 django、django-cron 库或 python 有关。)
我看过一些其他答案讨论了一些 cron 的常见问题,并尽力解决了所有问题:我的 crontab 在末尾有一个换行符,我已经设置了时区(尽管这不会影响我的 cronjob),pgrep cron
返回了一个数字,我已经设置了我的文本文件的权限,我已经重新启动了 cron 很多次,等等。
虽然我也尝试过正确设置环境路径,但我怀疑其中某些部分仍然不正确。我尝试了各种方法,例如/home
在 前面添加/user
、删除 前面的点和/或斜线manage.py
,以及在命令前面添加绝对文件路径,但都无济于事。
尽管我认为我的怀疑在于我如何设置路径,但错误仍然可能出在我的项目的其他地方。我忽略了什么问题,或者我应该如何诊断它?
答案1
我找到了问题的答案,同时我也意识到这篇文章的标题实际上是不正确的:crontab 正在执行,但问题是我的 cron 脚本中的 python 命令是不是正在被处决。
原因是 crontab 执行时使用的$PATH
变量与我在控制台中直接运行命令时使用的变量不同,其描述与接受的其他答案我链接了。我的错误是我完全误解了这个$PATH
变量;我以为它应该指向我项目中的可执行文件,而实际上它包含解释脚本的文件夹的路径(如 Python 解释器)。所以我的脚本没有被执行,因为 cron 找不到解释器来执行它们。一个非常愚蠢的错误,如果阅读文档就可以避免!
我对 django、django-cron 或 python 完全没有问题。
摘要:cron 使用了不同的路径。添加了默认环境路径($PATH
在控制台中输入以查看)。