2009-11-28 10 views
13

Grundsätzlich habe ich eine Liste von 30.000 URLs. Das Skript durchläuft die URLs und lädt sie herunter (mit einer Verzögerung von 3 Sekunden dazwischen). Und dann speichert es das HTML in einer Datenbank.Warum wird mein Python-Skript zufällig gelöscht?

Und es Loops und Schleifen ...

Warum es zufällig "getötet." Erhalten? Ich habe nichts angefasst.

Edit: das passiert auf 3 meiner Linux-Maschinen. Die Rechner befinden sich in einer Rackspace-Cloud mit 256 MB Speicher. Nichts anderes läuft.

+0

bekommen wahrscheinlich hilfreich sein, es würde Informationen über die Umgebung bereitzustellen, in dem das Skript ausgeführt wird. Zum Beispiel, führen Sie es auf Ihrem eigenen Server oder einem freigegebenen Host aus? Welche anderen Dinge laufen? Etc ... – Amber

+6

Eine Fehlerrückverfolgung wäre hilfreich. Ansonsten raten wir nur. Ich vermute es sind Zombies aus Area 51. –

+0

Es gibt keine Fehler. Es heißt nur "getötet". – TIMEX

Antwort

18

Sieht aus wie Sie aus Speichern möglicherweise ausgeführt werden - einfach auf einem langlaufende Programm passieren könnte, wenn Sie ein „Leck“ (zum Beispiel durch zirkuläre Referenzen zu akkumulieren) haben. Bietet Rackspace einfach zu verwendende Werkzeuge, um den Arbeitsspeicher eines Prozesses zu überwachen, sodass Sie feststellen können, ob dies der Fall ist? Ansonsten ist es nicht schwer, mit normalen Linux-Tools von außerhalb des Prozesses zu überwachen. Sobald Sie festgestellt haben, dass „out of memory“ ist die wahrscheinliche Ursache des Todes, Python-spezifische Tools wie pympler können Ihnen helfen, genau zu verfolgen, wo das Problem herkommt (und damit bestimmen, wie diese Verweise zu vermeiden - es sein, indem sie zu schwachen Referenzen oder anderen einfacheren Ansätzen - oder entfernen Sie die Lecks auf andere Weise.

+0

Ich denke, es ist nicht genügend Speicher, oder? Mem: 262364k insgesamt, 258264k verwendet, 4100k frei, 884k Puffer Swap: 524280k insgesamt, 285204k verwendet, 239076k frei, 14568k im Cache – TIMEX

+1

der SWAP geht weiter nach oben und oben. – TIMEX

+0

@alex, so sieht es definitiv wie ein "Leck" aus. Neben Pympler, was ich bereits vorgeschlagen habe, probier Guppy - http://guppy-pe.sourceforge.net/ - sie können dir dabei helfen, ** wo ** all diese Speicher auftauchen (deinen Code anzuschauen, den du gepostet hast) eine andere Frage, ohne über all die Bibliotheken von Drittanbietern Bescheid zu wissen, ist nirgends so hilfreich!). –

1

Ist es möglich, dass es eine nicht abgefangene Ausnahme trifft? Führst du das von einer Shell aus oder wird es von Cron oder auf andere automatisierte Weise ausgeführt? Wenn es automatisiert ist, wird die Ausgabe möglicherweise nirgends angezeigt.

14

In solchen Fällen sollten Sie die Protokolldateien überprüfen.

ich Debian und Ubuntu, so dass die Hauptprotokolldatei für mich ist: /var/log/syslog

Wenn Sie Red Hat verwenden, ich denke, das Protokoll ist: /var/log/messages

Wenn etwas passiert, das so außergewöhnlich wie das ist Kernel, der Ihren Prozess tötet, dort wird ein Protokollereignis sein, das es erklärt.

Ich vermute, dass Sie von der Out Of Memory Killer getroffen werden.

1

Verwenden Sie eine Art von Warteschlangenmanager oder Prozessmanager? Ich habe scheinbar zufällige Nachrichten verloren, als der Batch-Warteschlangenmanager, den ich verwendete, SIGUSR2 gesendet hat, als die Zeit abgelaufen war.

Ansonsten bevorzuge ich die Option nicht genügend Arbeitsspeicher.

0

Für diejenigen, die mit mysql hierher kam, fand ich diese Antworten hilfreich sein:

Verwendung SSCursor wie this

conn = MySQLdb.connect(host=DB_HOST, user=DB_USER, db=DB_NAME, 
         passwd=DB_PASSWORD, charset="utf8", 
         cursorclass=MySQLdb.cursors.SSCursor) 

und iterieren Cursor suggented als

von this vorgeschlagen
cursor = conn.cursor() 
cursor.execute("select * from very_big_table;")  
for row in cur: 
    # do what you want here 
    pass 

Achten Sie darauf, was die docsagt, so dass, wenn Sie schreiben wollen, und zur gleichen Zeit, sollten Sie eine andere Verbindung verwenden, oder Sie werden

`_mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now")` 
Verwandte Themen