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

时间:2013-12-10 22:26:41

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

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

永远运行Python脚本的建议方法是什么,在错误发生时记录错误,并在崩溃时重新启动?

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

4 个答案:

答案 0 :(得分:4)

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等启动和停止多个程序

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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

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

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

绝对保持睡眠状态,这样就无法控制CPU负载。

答案 3 :(得分:0)

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

对我来说,目标是要始终(在我的Linux计算机上)运行python脚本。 python脚本中也有一个“ while True”循环,理论上应该永久运行,但是如果由于某种原因我无法想到会崩溃,则希望脚本重新启动。另外,当我重新启动计算机时,它应该运行脚本。

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

在给定herehere的情况下,有两个很好的示例,显示了如何在/ etc / systemd / system或/ lib / systemd / system中写入.service文件。如果您想完全正确,则应该选择前者:

  

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

systemd here的文档即使您不是专家,也很容易阅读。

希望这对某人有帮助!