Почему мой python script случайным образом убивается?

В принципе, у меня есть список из 30 000 URL-адресов. script просматривает URL-адреса и загружает их (с задержкой в ​​3 секунды). И затем он хранит HTML в базе данных.

И он петли и петли...

Почему он случайно получает "Killed"? Я ничего не трогал.

Изменить: это происходит на 3 моих Linux-машинах. Машины находятся в облаке Rackspace с памятью 256 МБ. Ничего другого не работает.

Ответы

Ответ 1

Похоже, что у вас может быть нехватка памяти - это может случиться в долгосрочной перспективе, если у вас есть "утечка" (например, из-за накопления круговых ссылок). Предоставляет ли Rackspace какие-либо легко используемые инструменты для отслеживания памяти процесса, поэтому вы можете подтвердить, так ли это? В противном случае, такого рода вещи не сложно контролировать с помощью обычных инструментов Linux извне процесса. После того, как вы определили, что "из памяти" является вероятной причиной смерти, такие специфичные для Python инструменты, как pympler, помогут вам точно отслеживать где возникает проблема (и, таким образом, определяют, как избежать этих ссылок - будь то путем изменения их на слабые ссылки или другие более простые подходы - или иначе удалить утечки).

Ответ 2

В таких случаях вы должны проверить файлы журнала.

Я использую Debian и Ubuntu, поэтому основной файл журнала для меня: /var/log/syslog

Если вы используете Red Hat, я думаю, что журнал: /var/log/messages

Если что-то происходит так же необычно, как и ядро, убивающее ваш процесс, будет объяснено это событие журнала.

Я подозреваю, что вас атаковал Out Of Memory Killer.

Ответ 3

Возможно ли, что это ударит неперехваченное исключение? Вы запускаете это из оболочки или запускаете ее из cron или каким-либо другим автоматическим способом? Если он автоматизирован, вывод может не отображаться нигде.

Ответ 4

Используете ли вы какой-то менеджер очереди или диспетчер процессов? У меня были, по-видимому, случайные убитые сообщения, когда диспетчер очереди партий, который я использовал, отправлял SIGUSR2, когда время было.

В противном случае я сильно рекомендую опцию из памяти.

Ответ 5

Для тех, кто пришел сюда с mysql, я нашел, что ответы могут быть полезны:

используйте SSCursor как предложено этим

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

и повторите курсор, как это было предложено этим

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

Обратите внимание на то, что doc говорит You MUST retrieve the entire result set and close() the cursor before additional queries can be peformed on the connection., поэтому, если вы хотите писать и в то же время, вы должны использовать другое соединение, или вы получите

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