我有一个自定义命令,用于检查电子邮件帐户并下载和分析电子邮件。有关它的详细信息与此问题无关。通过cron执行Django自定义管理命令错误
当我从shell运行此命令,如:
cd /project_dir
./manage.py check_mail
它每次都运行正常。当通过crontab中执行相同的命令,它会返回一个奇怪的DB错误:
django.db.utils.DatabaseError: SSL error: sslv3 alert bad record mac
,并返回从代码的不同点是例外。始终从(非常简单)选择查询。
crontab条目很简单:
*/5 * * * * cd /project_dir && ./manage.py check_mail
而且它是由我与上面的测试登录同一用户运行。
我没有找到之前,PostgreSQL和Django的,这种“SSL错误”从一个子进程运行查询的时候,和我解决它,然后通过关闭连接来强制一个新的创造,如:
from django.db import connection
connection.close()
但这并没有帮助。 postgresql日志不会添加太多信息:
2013-01-19 16:03:09 GMT LOG: SSL error: decryption failed or bad record mac
2013-01-19 16:03:09 GMT LOG: could not receive data from client: Connection reset by peer
2013-01-19 16:03:09 GMT LOG: unexpected EOF on client connection
我使用python 2.6和Django 1.4。这是这些错误之一的(几乎)全追踪,但正如我所说,它并不总是从相同的查询提出:
File "/project_dir/appname/checkmail.py", line 527, in get_message
message = object.message_set.all().order_by('-time')[0]
File "/usr/local/lib/python2.6/dist-packages/Django-1.4-py2.6.egg/django/db/models/query.py", line 207, in __getitem__
return list(qs)[0]
File "/usr/local/lib/python2.6/dist-packages/Django-1.4-py2.6.egg/django/db/models/query.py", line 87, in __len__
self._result_cache.extend(self._iter)
File "/usr/local/lib/python2.6/dist-packages/Django-1.4-py2.6.egg/django/db/models/query.py", line 291, in iterator
for row in compiler.results_iter():
File "/usr/local/lib/python2.6/dist-packages/Django-1.4-py2.6.egg/django/db/models/sql/compiler.py", line 763, in results_iter
for rows in self.execute_sql(MULTI):
File "/usr/local/lib/python2.6/dist-packages/Django-1.4-py2.6.egg/django/db/models/sql/compiler.py", line 818, in execute_sql
cursor.execute(sql, params)
File "/usr/local/lib/python2.6/dist-packages/Django-1.4-py2.6.egg/django/db/backends/postgresql_psycopg2/base.py", line 52, in execute
return self.cursor.execute(query, args)
django.db.utils.DatabaseError: SSL error: sslv3 alert bad record mac
任何想法吗?
我刚刚发现用'su - user -c'命令在这里运行脚本“(其中”user“与crontab的所有者相同)运行良好。但我仍然想找到这个错误的来源。使用和不使用“su - user”运行时环境变量的差异与我无关。 – AJJ
我认为这个问题实际上是一个SSL重新协商问题。检查你的postgresql版本。我感到困惑的是为什么它在某些情况下有效,但在其他情况下却不起作用,可能是在某些情况下正在访问共享的psycopg2连接池? –