【问题标题】:Why does my python script randomly get killed?为什么我的 python 脚本会随机被杀死?
【发布时间】:2023-03-21 09:15:02
【问题描述】:

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

而且它循环和循环......

为什么它会随机被“杀死”?我什么都没碰。

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

【问题讨论】:

  • 提供有关脚本运行环境的信息可能会有所帮助。例如,您是在自己的服务器上运行它,还是在共享主机上运行它?还有什么其他的事情在运行?等等……
  • 错误回溯会很有帮助。否则,我们只是猜测。我猜是 51 区的僵尸。
  • 没有错误。它只是说“杀死”。

标签: python mysql url


【解决方案1】:

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

【讨论】:

  • 我认为它内存不足,对吧?内存:总计 262364k,已使用 258264k,可用 4100k,884k 缓冲区交换:总计 524280k,已使用 285204k,可用 239076k,缓存 14568k
  • SWAP 不断上涨。
  • @alex,所以它绝对看起来像一个“泄漏”。除了我已经建议的 pympler 之外,试试 guppy -- guppy-pe.sourceforge.net -- 他们可以帮助您确定所有内存的去向(查看您作为另一个问题发布的代码,但并不知道您正在使用的所有第三方库都无济于事!)。
【解决方案2】:

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

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

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

如果发生与内核杀死您的进程一样异常的事情,有一个日志事件来解释它。

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

【讨论】:

  • 如何在 docker 中查看我的文件的日志?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您是否正在使用某种队列管理器或某种进程管理器? 当我使用的批处理队列管理器在时间到时发送 SIGUSR2 时,我显然收到了随机终止消息。

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

    【讨论】:

      【解决方案5】:

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

      使用SSCursor 建议的this

      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")`
      

      【讨论】:

        猜你喜欢
        • 2021-05-02
        • 1970-01-01
        • 1970-01-01
        • 2015-05-09
        • 1970-01-01
        • 2014-03-21
        • 2014-01-22
        • 1970-01-01
        • 2014-11-06
        相关资源
        最近更新 更多