[英]Why does my python script randomly get killed?
基本上,我有一个30,000个URL的列表。 该脚本通过URL并下载它们(中间有3秒的延迟)。 然后它将HTML存储在数据库中。
它循环和循环......
为什么它会随机被“杀死”? 我没碰到任何东西。
编辑:这发生在我的3台Linux机器上。 这些机器位于具有256 MB内存的Rackspace云上。 没有其他东西在运行。
看起来你可能内存不足 - 如果你有“泄漏”(例如,由于累积循环引用),很可能会在长时间运行的程序中发生。 Rackspace是否提供任何易于使用的工具来跟踪进程的内存,因此您可以确认是否是这种情况? 否则,这种事情并不难从流程外部使用普通的Linux工具进行监控。 一旦确定“内存不足”可能是导致死亡的原因, pympler等特定于Python的工具可以帮助您准确跟踪问题的来源(从而确定如何避免这些引用 - 无论是通过更改它们是弱引用,或其他更简单的方法 - 或以其他方式消除泄漏)。
在这种情况下,您应该检查日志文件。
我使用Debian和Ubuntu,因此我的主要日志文件是: /var/log/syslog
如果你使用Red Hat,我认为日志是: /var/log/messages
如果发生的某些事是罕见,因为内核杀死你的过程中, 会出现一个日志事件解释它。
我怀疑你被Out Of Memory Killer击中了。
是否可能会遇到未被捕获的异常? 你是从shell运行它,还是从cron运行或以其他自动方式运行? 如果它是自动的,输出可能不会显示在任何地方。
您使用某种类型的队列管理器或进程管理器吗? 当我使用的批处理队列管理器在时间结束时发送SIGUSR2时,我得到了明显随机的消息。
否则我强烈支持内存不足选项。
对于那些带着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
请注意文档说明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")`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.