2013-01-19 71 views
1

我有一个自定义命令,用于检查电子邮件帐户并下载和分析电子邮件。有关它的详细信息与此问题无关。通过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 

任何想法吗?

+0

我刚刚发现用'su - user -c'命令在这里运行脚本“(其中”user“与crontab的所有者相同)运行良好。但我仍然想找到这个错误的来源。使用和不使用“su - user”运行时环境变量的差异与我无关。 – AJJ

+0

我认为这个问题实际上是一个SSL重新协商问题。检查你的postgresql版本。我感到困惑的是为什么它在某些情况下有效,但在其他情况下却不起作用,可能是在某些情况下正在访问共享的psycopg2连接池? –

回答

1

检查crontab是否运行相同版本的python。我的crontab条目看起来如下所示:

*/10 * * * * cd /projectdir ; PYTHONPATH=/home/myhome/python/south:/home/myhome/python /usr/local/bin/python2.6 manage.py notify 
+0

感谢罗布。我没有检查python版本以及相关软件包(psycopg2,django,...)的版本,但它们是相同的。 – AJJ

-1

crontab使用的默认shell可能是'sh'而不是bash。这意味着它运行的环境与通常在命令行中的环境不同。

,而不是直接从cron发出命令,试图在shell脚本运行的管理命令,然后调用从cron该脚本。工作示例将类似于此:

#!/bin/bash 

. /etc/profile 

cd /projectdir 
./manage.py check_mail 

如果您使用的virtualenv,一行添加到您来源的virtualenv的activate命令脚本。