2010-08-19 14 views
7

Manchmal, wenn Daten aus der Datenbank entweder über den Python-Shell oder über einen Python-Skript, der Python-Prozess stirbt, und ein einziges Wort an das Terminal gedruckt abruft: KilledWarum enden einige Django ORM-Abfragen abrupt mit der Meldung "Killed"?

, die buchstäblich alles, sagt sie. Es passiert nur bei bestimmten Skripten, aber immer bei diesen Skripten. Dies passiert konsistent mit dieser einen einzelnen Abfrage, die eine Weile dauert, und auch mit einer South-Migration, bei der eine Reihe von Zeilen einzeln zur Datenbank hinzugefügt wird.

Meine erste Ahnung war, dass eine einzelne Transaktion zu lange dauerte, also habe ich Autocommit für Postgres eingeschaltet. Hat das Problem nicht gelöst.

überprüfte ich die Postgres-Protokolle, und das ist das einzige, was da drin:

2010-08-19 22:06:34 UTC LOG: could not receive data from client: Connection reset by peer

2010-08-19 22:06:34 UTC LOG: unexpected EOF on client connection

ich googeln habe versucht, aber wie man erwarten könnte, ein Ein-Wort-Fehler Nachricht ist schwer zu googeln.

Ich benutze Django 1.2 mit Postgres 8.4 auf einer einzigen Ubuntu 10.4 Rackspace Cloud VPS, Lager Konfig für alles.

+3

nur eine Sache, die ich an das denken könnte töten automatisch einen Prozess auf Linux -.. die OOM Killer. Was ist in den Systemprotokollen? –

+0

'Aug 19 21:38:53 db kernel: [782904.033075] python aufgerufen oom-killer: gfp_mask = 0x200da, order = 0, oom_adj = 0' Sie haben Recht! Danke :) – Zain

Antwort

6

Nur eine Sache, die ich mir vorstellen kann, wird automatisch einen Prozess unter Linux beenden - der OOM Killer. Was ist in den Systemprotokollen?

+1

Der Vollständigkeit halber ist das bei Debian- und Ubuntu-Servern die Datei '/ var/log/syslog'. –

0

Wenn psycopg verwendet wird, besteht das Problem wahrscheinlich darin, dass die Datenbankverbindung nicht geschlossen wird.

Gemäß dem psycopg docs Beispiel:

# Connect to an existing database 
>>> conn = psycopg2.connect("dbname=test user=postgres") 
# Open a cursor to perform database operations 
>>> cur = conn.cursor() 
# Close communication with the database 
>>> cur.close() 
>>> conn.close() 

Beachten Sie, wenn Sie die Verbindung nicht löschen (mit dbcon.close() oder durch das Verbindungsobjekt zu löschen Sie wahrscheinlich einen Commit oder Rollback, je nachdem, welche Art ausgeben müssen von Transaktion geben Sie Ihre Verbindung unter arbeitet

Siehe the close connection docs für weitere Details

Verwandte Themen