while
循环和sleep
来持续运行代码。
推荐的方法是什么,可以让Python脚本永久运行,并在出现错误时记录错误,并在崩溃后重新启动?
node.js的forever
是否合适?我还在同一台Ubuntu服务器上运行node/meteor。
while
循环和sleep
来持续运行代码。
推荐的方法是什么,可以让Python脚本永久运行,并在出现错误时记录错误,并在崩溃后重新启动?
node.js的forever
是否合适?我还在同一台Ubuntu服务器上运行node/meteor。
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
等命令启动和停止多个程序。
最近写了类似的东西。我遵循的基本模式是
while True:
try:
#functionality
except SpecificError:
#log exception
except: #catch everything else
finally:
time.sleep(600)
要处理重新启动,您可以使用init.d或cron作业。
我不知道这对你是否仍然相关,但我一直在阅读如何做到这一点,并想在某个地方分享我所做的事情。
对我来说,目标是让一个Python脚本始终运行(在我的Linux电脑上)。该Python脚本还有一个“while True”循环,理论上应该永远运行,但如果由于任何我无法想到的原因而崩溃,我希望脚本能够重新启动。此外,当我重新启动计算机时,它应该运行该脚本。
我不是专家,但对我来说,最好和最易懂的方法是使用systemd(假设你使用Linux)。
这里有两个很好的例子,展示了如何在/etc/systemd/system或/lib/systemd/system中编写.service文件,链接分别为here和here。如果您想完全正确,您应该选择前者:
“/etc/systemd/system/: 系统管理员安装的单元” 1 systemd的文档在这里非常易于阅读,即使您不是专家。如果你正在编写一个守护进程,你应该使用这个命令: 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 负载。