永久运行Python脚本,记录错误并在崩溃时重新启动

4
我有一个Python脚本,不断处理新数据并写入MongoDB。在脚本中,使用while循环和sleep来持续运行代码。

推荐的方法是什么,可以让Python脚本永久运行,并在出现错误时记录错误,并在崩溃后重新启动?

node.js的forever是否合适?我还在同一台Ubuntu服务器上运行node/meteor。


你是否需要从Node/Meteor内部启动Python脚本?如果你只是通过数据库交互,为什么不单独启动它呢? - Christian Fritz
@ChristianF Python脚本不需要从node/meteor内部启动。我认为node/meteor可以帮助管理Python脚本。 - Nyxynyx
4个回答

4

Supervisord非常适合这种情况。以前,我每隔几分钟就会使用作业检查程序是否仍在运行,但是Supervisord可以在一个进程线程中运行所有程序,因此如果您的程序终止,Supervisord将自动重新启动该进程。我不再需要解析ps的输出以查看程序是否崩溃。

它具有简单的声明性配置文件和可配置的日志记录功能。默认情况下,它为your-program-name-stderr.log your-program-name-stdout.log创建日志文件,并且当从操作系统包管理器(例如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 等命令启动和停止多个程序。


1

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

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

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


0

我不知道这对你是否仍然相关,但我一直在阅读如何做到这一点,并想在某个地方分享我所做的事情。

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

我不是专家,但对我来说,最好和最易懂的方法是使用systemd(假设你使用Linux)。

这里有两个很好的例子,展示了如何在/etc/systemd/system或/lib/systemd/system中编写.service文件,链接分别为herehere。如果您想完全正确,您应该选择前者:

“/etc/systemd/system/: 系统管理员安装的单元” 1 systemd的文档在这里非常易于阅读,即使您不是专家。
希望这能帮助到某些人!

0

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

你可以从 System V /etc/init.d/ 脚本中生成它,或者使用 Upstart 来替换它。

Upstart: http://upstart.ubuntu.com/getting-started.html

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

我发现 System V 更容易编写,但如果它将被打包并分发在 Debian 文件中,我建议编写一个 Upstart 配置文件。

一定要保持睡眠状态,这样它就不会占用 CPU 负载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接