永远运行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的负载。