为什么我的python脚本会被随机杀死?

时间:2009-11-28 00:47:23

标签: python mysql url

基本上,我有一个包含30,000个网址的列表。 该脚本通过URL并下载它们(中间有3秒的延迟)。 然后它将HTML存储在数据库中。

它循环和循环......

为什么它会随机被“杀死”?我没碰到任何东西。

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

5 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:16)

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

我使用Debian和Ubuntu,因此我的主要日志文件是:/var/log/syslog

如果您使用Red Hat,我认为该日志为:/var/log/messages

如果发生的事情与内核杀死你的进程一样异常,那么成为解释它的日志事件。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

对于那些带着mysql来到这里的人,我发现这些答案可能会有所帮助:

使用this

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

并按照this

的建议迭代游标
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")`