繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM