【问题标题】:Run Python script forever, logging errors and restarting when crashes永远运行 Python 脚本,记录错误并在崩溃时重新启动
【发布时间】:2013-12-28 16:32:23
【问题描述】:

我有一个 python 脚本,可以持续处理新数据并写入 mongodb。在脚本中,它有一个while 循环和一个连续运行代码的sleep

永久运行 Python 脚本、在错误发生时记录错误并在崩溃时重新启动的推荐方法是什么?

node.js 的forever 合适吗?我也在同一个 Ubuntu 服务器上运行 node/meteor。

【问题讨论】:

  • 你甚至需要从 node/meteor 中启动那个 python 脚本吗?如果只是通过数据库进行交互,为什么不单独启动呢?
  • @ChristianF python 脚本不需要从节点/流星中开始。我想也许 node/meteor 可以帮助管理 python 脚本。

标签: python node.js python-2.7 meteor forever


【解决方案1】:

supervisord 非常适合这类事情。虽然我曾经每隔几分钟检查一次程序是否仍在运行 cron 作业,但 supervisord 在进程内线程中运行所有程序,因此如果您的程序终止,supervisord 将自动重新启动进程。我不再需要解析ps 的输出来查看程序是否崩溃了。

它有一个简单的声明性配置文件和可配置的日志记录。默认情况下,它会为 your-program-name-stderr.log your-program-name-stdout.log 创建一个日志文件,当从 OS 包管理器(对我来说是 Debian)安装 supervisord 时,logrotate 会自动处理这些文件。

如果您不想配置 supervisord 的日志记录,您应该在 python 中查看 logging,以便您可以控制进入这些文件的内容。

如果您使用的是 debian 衍生产品,您应该能够通过以 root 身份执行 apt-get install supervisord 来安装和启动守护进程。

配置文件也很简单:

[program:myprogram]
command=/path/to/my/program/script 
directory=/path/to/my/program/base
user=myuser
autostart=true
autorestart=true
redirect_stderr=True

supervisorctl 还允许您以交互方式查看程序正在执行的操作,并且可以使用supervisorctl start myprogram 等启动和停止多个程序

【讨论】:

    【解决方案2】:

    最近写了类似的东西。我遵循的基本模式是

    while True:
        try:
             #functionality
        except SpecificError:
            #log exception
        except: #catch everything else
        finally:
            time.sleep(600)
    

    要处理重启,您可以使用 init.d 或 cron 作业。

    【讨论】:

      【解决方案3】:

      如果你正在编写一个守护进程,你可能应该使用这个命令来完成它: http://manpages.ubuntu.com/manpages/lucid/man8/start-stop-daemon.8.html

      您可以从 System V /etc/init.d/ 脚本中生成它,或者使用正在慢慢替换它的 Upstart。

      新贵:http://upstart.ubuntu.com/getting-started.html

      系统五:http://www.cyberciti.biz/tips/linux-write-sys-v-init-script-to-start-stop-service.html

      我发现 System V 更容易编写,但如果这将被打包并分发到 debian 文件中,我建议编写一个 Upstart conf。

      一定要保持睡眠,这样它就不会控制 CPU 负载。

      【讨论】:

        【解决方案4】:

        我不知道这是否仍然与您相关,但我一直在阅读有关如何执行此操作的内容,并希望在某处分享我所做的。

        对我来说,目标是让 Python 脚本始终运行(在我的 Linux 计算机上)。 python脚本还有一个“while True”循环,理论上应该永远运行,但如果它出于任何我想不到的原因会崩溃,我希望脚本重新启动。另外,当我重新启动计算机时,它应该运行脚本。

        我不是专家,但对我来说最好和最容易理解的是使用 systemd(假设您使用 Linux)。

        在给定herehere 的情况下,有两个很好的示例说明如何在/etc/systemd/system 或/lib/systemd/system 中编写您的.service 文件。如果你想完全正确,你应该采取前者:

        " /etc/systemd/system/: 系统管理员安装的单元" 1

        systemd here 的文档实际上很好读,即使您不是专家。

        希望这对某人有所帮助!

        【讨论】:

          猜你喜欢
          • 2013-10-22
          • 1970-01-01
          • 2021-10-30
          • 1970-01-01
          • 2013-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多