2009-11-28 111 views
13

基本上,我有一个30,000个URL的列表。 该脚本通过URL并下载它们(两者之间有3秒的延迟)。 然后它将HTML存储在数据库中。为什么我的python脚本会被随机杀死?

它循环和循环...

为什么它会随机获得“Killed”?我什么也没碰。

编辑:这发生在我的3台Linux机器上。 机器位于具有256 MB内存的Rackspace云上。没有别的东西在运行。

+0

这很可能是有帮助的,以提供有关该脚本运行的环境信息。例如,你是在自己的服务器上还是共享主机上运行它?还有其他什么东西在运行?等等...... – Amber 2009-11-28 00:50:00

+6

错误回溯会有帮助。否则,我们只是猜测。我猜这是51区的僵尸。 – 2009-11-28 01:02:56

+0

没有错误。它只是说“被杀害”。 – TIMEX 2009-11-28 01:06:02

回答

18

看起来您可能内存不足 - 如果您有“泄漏”(例如,由于积累了循环引用),可能很容易发生在长时间运行的程序中。 Rackspace是否提供任何易于使用的工具来跟踪进程的内存,因此您可以确认是否属于这种情况?否则,这种事情并不难于用流程外的普通Linux工具进行监控。一旦确定“内存不足”可能导致死亡,Python专用工具(如pympler)可以帮助您准确跟踪问题的来源(从而确定如何避免这些引用 - 通过更改他们弱参考,或其他更简单的方法 - 否则删除泄漏)。

+0

我认为它内存不足,对吧? Mem:总计26​​2364k,使用258264k,使用4100k,使用884k缓冲区 更换:总共524280k,使用285204k,使用239076k,使用14568k缓存 – TIMEX 2009-11-28 01:02:50

+1

SWAP持续上涨。 – TIMEX 2009-11-28 01:05:14

+0

@alex,所以绝对看起来像一个“泄漏”。除了我已经建议的pympler,请尝试古比 - http://guppy-pe.sourceforge.net/ - 他们可以帮助您确定**所有内存的位置(查看您的代码,另一个问题,不知道你正在使用的所有第三方库,没有任何帮助!)。 – 2009-11-28 05:15:10

1

是否有可能触及未捕获的异常?你是从shell运行它,还是从cron或其他自动化方式运行?如果它是自动的,输出可能不会显示在任何地方。

14

在这种情况下,您应该检查日志文件。

我用Debian和Ubuntu,所以我的主要日志文件是:/var/log/syslog

如果您使用红帽,我认为日志:/var/log/messages

三长两短是因为作为特殊内核查杀你的进程,作为解释它的日志事件。

我怀疑你被Out Of Memory Killer击中。

1

您是否在使用某种队列管理器或某种类型的进程管理器? 当我使用的批处理队列管理器在时间到时发送SIGUSR2时,我明显遇到了随机杀死的消息。

否则我强烈支持内存不足选项。

0

对于那些谁来到这里与mysql,我发现这个答案可以通过有益的:通过this

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

为suggented

使用SSCursor和遍历光标通过this

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

注意什么docYou 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")`