基本上,我有一个包含30,000个网址的列表。 该脚本通过URL并下载它们(中间有3秒的延迟)。 然后它将HTML存储在数据库中。
它循环和循环......
为什么它会随机被“杀死”?我没碰到任何东西。
编辑:这发生在我的3台Linux机器上。 这些机器位于具有256 MB内存的Rackspace云上。没有其他东西在运行。
答案 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")`