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

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

什么是推荐的方式永远运行Python脚本,发生错误时logging错误,并在崩溃时重新启动?

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

supervisord是完美的这种事情。 虽然我曾经使用cron作业检查程序是否每隔几分钟运行一次,但是supervisord会在进程内运行所有程序,所以如果程序终止,supervisord会自动重启进程。 我不再需要parsingps的输出来查看程序是否崩溃。

它有一个简单的声明configuration文件和可configuration的日志logging。 默认情况下,它会为your-program-name-stderr.log创build一个日志文件, your-program-name-stderr.log your-program-name-stdout.log当从OS软件包pipe理器(我为Debian)安装supervisord时,会自动由logrotate处理。

如果你不想configurationsupervisord的日志logging,你应该看看在Python中的日志logging ,所以你可以控制进入这些文件的内容。

如果您使用的是Debian衍生产品,则只需通过以root用户身份执行apt-get install supervisord ,就可以安装并启动守护进程。

configuration文件也非常简单:

 [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

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

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

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

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

你可以从System V /etc/init.d/脚本产生这个,或者使用Upstart慢慢replace它。

新贵: 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文件中,我build议写一个Upstart conf。

绝对保持睡眠,这样它就不会掌握CPU的负载。