我有一个python脚本,不断处理新数据并写入mongodb。在脚本中,它是一个while
循环和一个连续运行代码的sleep
。
什么是永久运行Python脚本的建议方法,在错误发生时记录错误,并在崩溃时重新启动?
node.js的forever
会不合适?我也在同一个Ubuntu服务器上运行node / meteor。
supervisord非常适合这种事情。虽然我曾经使用cron
作业检查程序是否仍然每隔几分钟运行一次,但是supervisord在进程内线程中运行所有程序,因此在程序终止时,supervisord将自动重启该进程。我不再需要解析ps
的输出以查看程序是否崩溃。
它有一个简单的声明配置文件和可配置的日志记录。默认情况下,它会为your-program-name-stderr.log
your-program-name-stdout.log
创建一个日志文件,当从OS软件包管理器安装supervisord时,它会由logrotate自动处理(对我来说是Debian)。
如果你不想配置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
等启动和停止多个程序
最近写了类似的东西。我遵循的基本模式是
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。
新贵: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负载。
我不知道这是否仍然与你有关,但我一直在阅读如何做到这一点,并希望分享我所做的事情。
对我来说,目标是始终运行python脚本(在我的Linux计算机上)。 python脚本中还有一个“while True”循环,它理论上应该永远运行,但如果因为任何原因我想不到会崩溃,我希望脚本重新启动。此外,当我重新启动计算机时,它应该运行脚本。
我不是专家,但对我来说最好和最容易理解的是使用systemd(假设你使用的是Linux)。
有两个很好的例子,说明如何在here和here中执行此操作,演示如何在/ etc / systemd / system或/ lib / systemd / system中编写.service文件。如果你想完全正确,你应该采取前者:
“/ etc / systemd / system /:由系统管理员安装的单元”1
即使您不是专家,systemd here的文档实际上也很好阅读。
希望这有助于某人!