通过cron执行Django自定义管理命令错误

时间:2013-01-19 16:10:05

标签: python django postgresql crontab

我有一个自定义命令,可以检查电子邮件帐户并下载和解析电子邮件。有关它的详细信息与此问题无关。

当我从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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

检查crontab是否运行相同版本的python。我的crontab条目实际上如下所示:

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

答案 1 :(得分:-1)

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

不是直接从cron发出命令,而是尝试在shell脚本中运行管理命令,然后从cron调用该脚本。一个工作示例看起来与此类似:

#!/bin/bash

. /etc/profile

cd /projectdir
./manage.py check_mail

如果您使用的是virtualenv,请在脚本中添加一行,以便为您提供virtualenv的activate命令。